public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] create a kstrdup library function
@ 2005-04-04 19:44 Paulo Marques
  2005-04-04 21:15 ` Adrian Bunk
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Paulo Marques @ 2005-04-04 19:44 UTC (permalink / raw)
  To: LKML; +Cc: Andrew Morton

[-- Attachment #1: Type: text/plain, Size: 1680 bytes --]


Hi,

This patch creates a new kstrdup library function and changes the 
"local" implementations in several places to use this function.

This is just a cleanup to allow reusing the strdup code, and to prevent 
bugs in future duplications of strdup.

Most of the changes come from the sound and net subsystems. The sound 
part had already been acknowledged by Takashi Iwai and the net part by 
David S. Miller.

I left UML alone for now because I would need more time to read the code 
carefully before making changes there.


Signed-off-by: Paulo Marques <pmarques@grupopie.com>

  drivers/md/dm-ioctl.c      |   14 +++-----------
  drivers/parport/probe.c    |   18 +++++-------------
  include/linux/netdevice.h  |    4 ----
  include/linux/string.h     |    2 ++
  include/sound/core.h       |    3 ++-
  lib/string.c               |   20 ++++++++++++++++++++
  net/core/neighbour.c       |    3 ++-
  net/core/sysctl_net_core.c |   15 ---------------
  net/ipv4/devinet.c         |    2 +-
  net/ipv6/addrconf.c        |    3 ++-
  net/sunrpc/svcauth_unix.c  |   11 ++---------
  sound/core/info.c          |    3 ++-
  sound/core/info_oss.c      |    3 ++-
  sound/core/memory.c        |   41 
++++++++++++++---------------------------
  sound/core/oss/mixer_oss.c |    3 ++-
  sound/core/oss/pcm_oss.c   |    3 ++-
  sound/core/sound.c         |    2 +-
  sound/core/timer.c         |    3 ++-
  sound/isa/gus/gus_mem.c    |    7 ++++---
  sound/synth/emux/emux.c    |    3 ++-
  20 files changed, 70 insertions(+), 93 deletions(-)

-- 
Paulo Marques - www.grupopie.com

All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke (1729 - 1797)

[-- Attachment #2: strdup_patch --]
[-- Type: text/plain, Size: 18904 bytes --]

diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/drivers/md/dm-ioctl.c linux-2.6.12-rc1-mm4/drivers/md/dm-ioctl.c
--- linux-2.6.12-rc1-mm4.vanilla/drivers/md/dm-ioctl.c	2005-03-02 07:37:51.000000000 +0000
+++ linux-2.6.12-rc1-mm4/drivers/md/dm-ioctl.c	2005-04-04 20:17:36.000000000 +0100
@@ -122,14 +122,6 @@ static struct hash_cell *__get_uuid_cell
 /*-----------------------------------------------------------------
  * Inserting, removing and renaming a device.
  *---------------------------------------------------------------*/
-static inline char *kstrdup(const char *str)
-{
-	char *r = kmalloc(strlen(str) + 1, GFP_KERNEL);
-	if (r)
-		strcpy(r, str);
-	return r;
-}
-
 static struct hash_cell *alloc_cell(const char *name, const char *uuid,
 				    struct mapped_device *md)
 {
@@ -139,7 +131,7 @@ static struct hash_cell *alloc_cell(cons
 	if (!hc)
 		return NULL;
 
-	hc->name = kstrdup(name);
+	hc->name = kstrdup(name, GFP_KERNEL);
 	if (!hc->name) {
 		kfree(hc);
 		return NULL;
@@ -149,7 +141,7 @@ static struct hash_cell *alloc_cell(cons
 		hc->uuid = NULL;
 
 	else {
-		hc->uuid = kstrdup(uuid);
+		hc->uuid = kstrdup(uuid, GFP_KERNEL);
 		if (!hc->uuid) {
 			kfree(hc->name);
 			kfree(hc);
@@ -273,7 +265,7 @@ static int dm_hash_rename(const char *ol
 	/*
 	 * duplicate new.
 	 */
-	new_name = kstrdup(new);
+	new_name = kstrdup(new, GFP_KERNEL);
 	if (!new_name)
 		return -ENOMEM;
 
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/drivers/parport/probe.c linux-2.6.12-rc1-mm4/drivers/parport/probe.c
--- linux-2.6.12-rc1-mm4.vanilla/drivers/parport/probe.c	2005-04-01 18:01:29.000000000 +0100
+++ linux-2.6.12-rc1-mm4/drivers/parport/probe.c	2005-04-04 20:17:36.000000000 +0100
@@ -48,14 +48,6 @@ static void pretty_print(struct parport 
 	printk("\n");
 }
 
-static char *strdup(char *str)
-{
-	int n = strlen(str)+1;
-	char *s = kmalloc(n, GFP_KERNEL);
-	if (!s) return NULL;
-	return strcpy(s, str);
-}
-
 static void parse_data(struct parport *port, int device, char *str)
 {
 	char *txt = kmalloc(strlen(str)+1, GFP_KERNEL);
@@ -88,16 +80,16 @@ static void parse_data(struct parport *p
 			if (!strcmp(p, "MFG") || !strcmp(p, "MANUFACTURER")) {
 				if (info->mfr)
 					kfree (info->mfr);
-				info->mfr = strdup(sep);
+				info->mfr = kstrdup(sep, GFP_KERNEL);
 			} else if (!strcmp(p, "MDL") || !strcmp(p, "MODEL")) {
 				if (info->model)
 					kfree (info->model);
-				info->model = strdup(sep);
+				info->model = kstrdup(sep, GFP_KERNEL);
 			} else if (!strcmp(p, "CLS") || !strcmp(p, "CLASS")) {
 				int i;
 				if (info->class_name)
 					kfree (info->class_name);
-				info->class_name = strdup(sep);
+				info->class_name = kstrdup(sep, GFP_KERNEL);
 				for (u = sep; *u; u++)
 					*u = toupper(*u);
 				for (i = 0; classes[i].token; i++) {
@@ -112,7 +104,7 @@ static void parse_data(struct parport *p
 				   !strcmp(p, "COMMAND SET")) {
 				if (info->cmdset)
 					kfree (info->cmdset);
-				info->cmdset = strdup(sep);
+				info->cmdset = kstrdup(sep, GFP_KERNEL);
 				/* if it speaks printer language, it's
 				   probably a printer */
 				if (strstr(sep, "PJL") || strstr(sep, "PCL"))
@@ -120,7 +112,7 @@ static void parse_data(struct parport *p
 			} else if (!strcmp(p, "DES") || !strcmp(p, "DESCRIPTION")) {
 				if (info->description)
 					kfree (info->description);
-				info->description = strdup(sep);
+				info->description = kstrdup(sep, GFP_KERNEL);
 			}
 		}
 	rock_on:
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/include/linux/netdevice.h linux-2.6.12-rc1-mm4/include/linux/netdevice.h
--- linux-2.6.12-rc1-mm4.vanilla/include/linux/netdevice.h	2005-04-01 18:01:44.000000000 +0100
+++ linux-2.6.12-rc1-mm4/include/linux/netdevice.h	2005-04-04 20:17:36.000000000 +0100
@@ -924,10 +924,6 @@ extern int skb_checksum_help(struct sk_b
 extern void		net_enable_timestamp(void);
 extern void		net_disable_timestamp(void);
 
-#ifdef CONFIG_SYSCTL
-extern char *net_sysctl_strdup(const char *s);
-#endif
-
 #endif /* __KERNEL__ */
 
 #endif	/* _LINUX_DEV_H */
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/include/linux/string.h linux-2.6.12-rc1-mm4/include/linux/string.h
--- linux-2.6.12-rc1-mm4.vanilla/include/linux/string.h	2005-03-02 07:38:07.000000000 +0000
+++ linux-2.6.12-rc1-mm4/include/linux/string.h	2005-04-04 20:17:36.000000000 +0100
@@ -88,6 +88,8 @@ extern int memcmp(const void *,const voi
 extern void * memchr(const void *,int,__kernel_size_t);
 #endif
 
+extern char *kstrdup(const char *s, int gfp);
+
 #ifdef __cplusplus
 }
 #endif
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/include/sound/core.h linux-2.6.12-rc1-mm4/include/sound/core.h
--- linux-2.6.12-rc1-mm4.vanilla/include/sound/core.h	2005-04-01 18:01:44.000000000 +0100
+++ linux-2.6.12-rc1-mm4/include/sound/core.h	2005-04-04 20:17:36.000000000 +0100
@@ -292,6 +292,7 @@ void *snd_hidden_kcalloc(size_t n, size_
 void snd_hidden_kfree(const void *obj);
 void *snd_hidden_vmalloc(unsigned long size);
 void snd_hidden_vfree(void *obj);
+char *snd_hidden_kstrdup(const char *s, int flags);
 #define kmalloc(size, flags) snd_hidden_kmalloc(size, flags)
 #define kcalloc(n, size, flags) snd_hidden_kcalloc(n, size, flags)
 #define kfree(obj) snd_hidden_kfree(obj)
@@ -301,6 +302,7 @@ void snd_hidden_vfree(void *obj);
 #define vmalloc_nocheck(size) snd_wrapper_vmalloc(size)
 #define kfree_nocheck(obj) snd_wrapper_kfree(obj)
 #define vfree_nocheck(obj) snd_wrapper_vfree(obj)
+#define kstrdup(s, flags)  snd_hidden_kstrdup(s, flags)
 #else
 #define snd_memory_init() /*NOP*/
 #define snd_memory_done() /*NOP*/
@@ -311,7 +313,6 @@ void snd_hidden_vfree(void *obj);
 #define kfree_nocheck(obj) kfree(obj)
 #define vfree_nocheck(obj) vfree(obj)
 #endif
-char *snd_kmalloc_strdup(const char *string, int flags);
 int copy_to_user_fromio(void __user *dst, const volatile void __iomem *src, size_t count);
 int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size_t count);
 
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/lib/string.c linux-2.6.12-rc1-mm4/lib/string.c
--- linux-2.6.12-rc1-mm4.vanilla/lib/string.c	2005-03-02 07:38:25.000000000 +0000
+++ linux-2.6.12-rc1-mm4/lib/string.c	2005-04-04 20:17:36.000000000 +0100
@@ -599,3 +599,23 @@ void *memchr(const void *s, int c, size_
 }
 EXPORT_SYMBOL(memchr);
 #endif
+
+/*
+ * kstrdup - allocate space for and copy an existing string
+ *
+ * @s: the string to duplicate
+ * @gfp: the GFP mask used in the kmalloc() call when allocating memory
+ */
+char *kstrdup(const char *s, int gfp)
+{
+	int len;
+	char *buf;
+
+	if (!s) return NULL;
+
+	len = strlen(s) + 1;
+	buf = kmalloc(len, gfp);
+	if (buf)
+		memcpy(buf, s, len);
+	return buf;
+}
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/net/core/neighbour.c linux-2.6.12-rc1-mm4/net/core/neighbour.c
--- linux-2.6.12-rc1-mm4.vanilla/net/core/neighbour.c	2005-04-01 18:01:32.000000000 +0100
+++ linux-2.6.12-rc1-mm4/net/core/neighbour.c	2005-04-04 20:17:36.000000000 +0100
@@ -32,6 +32,7 @@
 #include <net/sock.h>
 #include <linux/rtnetlink.h>
 #include <linux/random.h>
+#include <linux/string.h>
 
 #define NEIGH_DEBUG 1
 
@@ -2281,7 +2282,7 @@ int neigh_sysctl_register(struct net_dev
 		t->neigh_vars[17].extra1 = dev;
 	}
 
-	dev_name = net_sysctl_strdup(dev_name_source);
+	dev_name = kstrdup(dev_name_source, GFP_KERNEL);
 	if (!dev_name) {
 		err = -ENOBUFS;
 		goto free;
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/net/core/sysctl_net_core.c linux-2.6.12-rc1-mm4/net/core/sysctl_net_core.c
--- linux-2.6.12-rc1-mm4.vanilla/net/core/sysctl_net_core.c	2005-03-02 07:38:03.000000000 +0000
+++ linux-2.6.12-rc1-mm4/net/core/sysctl_net_core.c	2005-04-04 20:17:36.000000000 +0100
@@ -35,19 +35,6 @@ extern int sysctl_somaxconn;
 extern char sysctl_divert_version[];
 #endif /* CONFIG_NET_DIVERT */
 
-/*
- * This strdup() is used for creating copies of network 
- * device names to be handed over to sysctl.
- */
- 
-char *net_sysctl_strdup(const char *s)
-{
-	char *rv = kmalloc(strlen(s)+1, GFP_KERNEL);
-	if (rv)
-		strcpy(rv, s);
-	return rv;
-}
-
 ctl_table core_table[] = {
 #ifdef CONFIG_NET
 	{
@@ -177,6 +164,4 @@ ctl_table core_table[] = {
 	{ .ctl_name = 0 }
 };
 
-EXPORT_SYMBOL(net_sysctl_strdup);
-
 #endif
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/net/ipv4/devinet.c linux-2.6.12-rc1-mm4/net/ipv4/devinet.c
--- linux-2.6.12-rc1-mm4.vanilla/net/ipv4/devinet.c	2005-04-01 18:01:44.000000000 +0100
+++ linux-2.6.12-rc1-mm4/net/ipv4/devinet.c	2005-04-04 20:17:36.000000000 +0100
@@ -1449,7 +1449,7 @@ static void devinet_sysctl_register(stru
 	 * by sysctl and we wouldn't want anyone to change it under our feet
 	 * (see SIOCSIFNAME).
 	 */	
-	dev_name = net_sysctl_strdup(dev_name);
+	dev_name = kstrdup(dev_name, GFP_KERNEL);
 	if (!dev_name)
 	    goto free;
 
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/net/ipv6/addrconf.c linux-2.6.12-rc1-mm4/net/ipv6/addrconf.c
--- linux-2.6.12-rc1-mm4.vanilla/net/ipv6/addrconf.c	2005-04-01 18:01:44.000000000 +0100
+++ linux-2.6.12-rc1-mm4/net/ipv6/addrconf.c	2005-04-04 20:17:36.000000000 +0100
@@ -57,6 +57,7 @@
 #endif
 #include <linux/delay.h>
 #include <linux/notifier.h>
+#include <linux/string.h>
 
 #include <net/sock.h>
 #include <net/snmp.h>
@@ -3439,7 +3440,7 @@ static void addrconf_sysctl_register(str
 	 * by sysctl and we wouldn't want anyone to change it under our feet
 	 * (see SIOCSIFNAME).
 	 */	
-	dev_name = net_sysctl_strdup(dev_name);
+	dev_name = kstrdup(dev_name, GFP_KERNEL);
 	if (!dev_name)
 	    goto free;
 
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/net/sunrpc/svcauth_unix.c linux-2.6.12-rc1-mm4/net/sunrpc/svcauth_unix.c
--- linux-2.6.12-rc1-mm4.vanilla/net/sunrpc/svcauth_unix.c	2005-04-01 18:01:32.000000000 +0100
+++ linux-2.6.12-rc1-mm4/net/sunrpc/svcauth_unix.c	2005-04-04 20:17:36.000000000 +0100
@@ -8,6 +8,7 @@
 #include <linux/err.h>
 #include <linux/seq_file.h>
 #include <linux/hash.h>
+#include <linux/string.h>
 
 #define RPCDBG_FACILITY	RPCDBG_AUTH
 
@@ -20,14 +21,6 @@
  */
 
 
-static char *strdup(char *s)
-{
-	char *rv = kmalloc(strlen(s)+1, GFP_KERNEL);
-	if (rv)
-		strcpy(rv, s);
-	return rv;
-}
-
 struct unix_domain {
 	struct auth_domain	h;
 	int	addr_changes;
@@ -55,7 +48,7 @@ struct auth_domain *unix_domain_find(cha
 	if (new == NULL)
 		return NULL;
 	cache_init(&new->h.h);
-	new->h.name = strdup(name);
+	new->h.name = kstrdup(name, GFP_KERNEL);
 	new->h.flavour = RPC_AUTH_UNIX;
 	new->addr_changes = 0;
 	new->h.h.expiry_time = NEVER;
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/core/info.c linux-2.6.12-rc1-mm4/sound/core/info.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/core/info.c	2005-04-01 18:01:44.000000000 +0100
+++ linux-2.6.12-rc1-mm4/sound/core/info.c	2005-04-04 20:17:36.000000000 +0100
@@ -24,6 +24,7 @@
 #include <linux/vmalloc.h>
 #include <linux/time.h>
 #include <linux/smp_lock.h>
+#include <linux/string.h>
 #include <sound/core.h>
 #include <sound/minors.h>
 #include <sound/info.h>
@@ -754,7 +755,7 @@ static snd_info_entry_t *snd_info_create
 	entry = kcalloc(1, sizeof(*entry), GFP_KERNEL);
 	if (entry == NULL)
 		return NULL;
-	entry->name = snd_kmalloc_strdup(name, GFP_KERNEL);
+	entry->name = kstrdup(name, GFP_KERNEL);
 	if (entry->name == NULL) {
 		kfree(entry);
 		return NULL;
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/core/info_oss.c linux-2.6.12-rc1-mm4/sound/core/info_oss.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/core/info_oss.c	2005-03-02 07:37:49.000000000 +0000
+++ linux-2.6.12-rc1-mm4/sound/core/info_oss.c	2005-04-04 20:17:36.000000000 +0100
@@ -22,6 +22,7 @@
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <linux/time.h>
+#include <linux/string.h>
 #include <sound/core.h>
 #include <sound/minors.h>
 #include <sound/info.h>
@@ -51,7 +52,7 @@ int snd_oss_info_register(int dev, int n
 			x = NULL;
 		}
 	} else {
-		x = snd_kmalloc_strdup(string, GFP_KERNEL);
+		x = kstrdup(string, GFP_KERNEL);
 		if (x == NULL) {
 			up(&strings);
 			return -ENOMEM;
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/core/memory.c linux-2.6.12-rc1-mm4/sound/core/memory.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/core/memory.c	2005-04-01 18:01:32.000000000 +0100
+++ linux-2.6.12-rc1-mm4/sound/core/memory.c	2005-04-04 20:17:36.000000000 +0100
@@ -184,6 +184,20 @@ void snd_hidden_vfree(void *obj)
 	snd_wrapper_vfree(obj);
 }
 
+char *snd_hidden_kstrdup(const char *s, int flags)
+{
+	int len;
+	char *buf;
+	
+	if (!s) return NULL;
+	
+	len = strlen(s) + 1;
+	buf = _snd_kmalloc(len, flags);
+	if (buf)
+		memcpy(buf, s, len);
+	return buf;
+}
+
 static void snd_memory_info_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer)
 {
 	snd_iprintf(buffer, "kmalloc: %li bytes\n", snd_alloc_kmalloc);
@@ -214,36 +228,9 @@ int __exit snd_memory_info_done(void)
 	return 0;
 }
 
-#else
-
-#define _snd_kmalloc kmalloc
-
 #endif /* CONFIG_SND_DEBUG_MEMORY */
 
 /**
- * snd_kmalloc_strdup - copy the string
- * @string: the original string
- * @flags: allocation conditions, GFP_XXX
- *
- * Allocates a memory chunk via kmalloc() and copies the string to it.
- *
- * Returns the pointer, or NULL if no enoguh memory.
- */
-char *snd_kmalloc_strdup(const char *string, int flags)
-{
-	size_t len;
-	char *ptr;
-
-	if (!string)
-		return NULL;
-	len = strlen(string) + 1;
-	ptr = _snd_kmalloc(len, flags);
-	if (ptr)
-		memcpy(ptr, string, len);
-	return ptr;
-}
-
-/**
  * copy_to_user_fromio - copy data from mmio-space to user-space
  * @dst: the destination pointer on user-space
  * @src: the source pointer on mmio
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/core/oss/mixer_oss.c linux-2.6.12-rc1-mm4/sound/core/oss/mixer_oss.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/core/oss/mixer_oss.c	2005-04-01 18:01:45.000000000 +0100
+++ linux-2.6.12-rc1-mm4/sound/core/oss/mixer_oss.c	2005-04-04 20:17:36.000000000 +0100
@@ -24,6 +24,7 @@
 #include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <linux/time.h>
+#include <linux/string.h>
 #include <sound/core.h>
 #include <sound/minors.h>
 #include <sound/control.h>
@@ -1137,7 +1138,7 @@ static void snd_mixer_oss_proc_write(snd
 			goto __unlock;
 		}
 		tbl->oss_id = ch;
-		tbl->name = snd_kmalloc_strdup(str, GFP_KERNEL);
+		tbl->name = kstrdup(str, GFP_KERNEL);
 		if (! tbl->name) {
 			kfree(tbl);
 			goto __unlock;
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/core/oss/pcm_oss.c linux-2.6.12-rc1-mm4/sound/core/oss/pcm_oss.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/core/oss/pcm_oss.c	2005-04-01 18:01:45.000000000 +0100
+++ linux-2.6.12-rc1-mm4/sound/core/oss/pcm_oss.c	2005-04-04 20:17:36.000000000 +0100
@@ -33,6 +33,7 @@
 #include <linux/time.h>
 #include <linux/vmalloc.h>
 #include <linux/moduleparam.h>
+#include <linux/string.h>
 #include <sound/core.h>
 #include <sound/minors.h>
 #include <sound/pcm.h>
@@ -2347,7 +2348,7 @@ static void snd_pcm_oss_proc_write(snd_i
 					for (setup1 = pstr->oss.setup_list; setup1->next; setup1 = setup1->next);
 					setup1->next = setup;
 				}
-				template.task_name = snd_kmalloc_strdup(task_name, GFP_KERNEL);
+				template.task_name = kstrdup(task_name, GFP_KERNEL);
 			} else {
 				buffer->error = -ENOMEM;
 			}
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/core/sound.c linux-2.6.12-rc1-mm4/sound/core/sound.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/core/sound.c	2005-04-01 18:01:45.000000000 +0100
+++ linux-2.6.12-rc1-mm4/sound/core/sound.c	2005-04-04 20:17:36.000000000 +0100
@@ -399,8 +399,8 @@ EXPORT_SYMBOL(snd_hidden_kcalloc);
 EXPORT_SYMBOL(snd_hidden_kfree);
 EXPORT_SYMBOL(snd_hidden_vmalloc);
 EXPORT_SYMBOL(snd_hidden_vfree);
+EXPORT_SYMBOL(snd_hidden_kstrdup);
 #endif
-EXPORT_SYMBOL(snd_kmalloc_strdup);
 EXPORT_SYMBOL(copy_to_user_fromio);
 EXPORT_SYMBOL(copy_from_user_toio);
   /* init.c */
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/core/timer.c linux-2.6.12-rc1-mm4/sound/core/timer.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/core/timer.c	2005-04-01 18:01:45.000000000 +0100
+++ linux-2.6.12-rc1-mm4/sound/core/timer.c	2005-04-04 20:17:36.000000000 +0100
@@ -26,6 +26,7 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/moduleparam.h>
+#include <linux/string.h>
 #include <sound/core.h>
 #include <sound/timer.h>
 #include <sound/control.h>
@@ -99,7 +100,7 @@ static snd_timer_instance_t *snd_timer_i
 	timeri = kcalloc(1, sizeof(*timeri), GFP_KERNEL);
 	if (timeri == NULL)
 		return NULL;
-	timeri->owner = snd_kmalloc_strdup(owner, GFP_KERNEL);
+	timeri->owner = kstrdup(owner, GFP_KERNEL);
 	if (! timeri->owner) {
 		kfree(timeri);
 		return NULL;
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/isa/gus/gus_mem.c linux-2.6.12-rc1-mm4/sound/isa/gus/gus_mem.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/isa/gus/gus_mem.c	2005-03-02 07:38:07.000000000 +0000
+++ linux-2.6.12-rc1-mm4/sound/isa/gus/gus_mem.c	2005-04-04 20:17:36.000000000 +0100
@@ -21,6 +21,7 @@
 
 #include <sound/driver.h>
 #include <linux/slab.h>
+#include <linux/string.h>
 #include <sound/core.h>
 #include <sound/gus.h>
 #include <sound/info.h>
@@ -213,7 +214,7 @@ snd_gf1_mem_block_t *snd_gf1_mem_alloc(s
 	if (share_id != NULL)
 		memcpy(&block.share_id, share_id, sizeof(block.share_id));
 	block.owner = owner;
-	block.name = snd_kmalloc_strdup(name, GFP_KERNEL);
+	block.name = kstrdup(name, GFP_KERNEL);
 	nblock = snd_gf1_mem_xalloc(alloc, &block);
 	snd_gf1_mem_lock(alloc, 1);
 	return nblock;
@@ -253,13 +254,13 @@ int snd_gf1_mem_init(snd_gus_card_t * gu
 	if (gus->gf1.enh_mode) {
 		block.ptr = 0;
 		block.size = 1024;
-		block.name = snd_kmalloc_strdup("InterWave LFOs", GFP_KERNEL);
+		block.name = kstrdup("InterWave LFOs", GFP_KERNEL);
 		if (snd_gf1_mem_xalloc(alloc, &block) == NULL)
 			return -ENOMEM;
 	}
 	block.ptr = gus->gf1.default_voice_address;
 	block.size = 4;
-	block.name = snd_kmalloc_strdup("Voice default (NULL's)", GFP_KERNEL);
+	block.name = kstrdup("Voice default (NULL's)", GFP_KERNEL);
 	if (snd_gf1_mem_xalloc(alloc, &block) == NULL)
 		return -ENOMEM;
 #ifdef CONFIG_SND_DEBUG
diff -uprN -X dontdiff linux-2.6.12-rc1-mm4.vanilla/sound/synth/emux/emux.c linux-2.6.12-rc1-mm4/sound/synth/emux/emux.c
--- linux-2.6.12-rc1-mm4.vanilla/sound/synth/emux/emux.c	2005-03-02 07:38:09.000000000 +0000
+++ linux-2.6.12-rc1-mm4/sound/synth/emux/emux.c	2005-04-04 20:17:36.000000000 +0100
@@ -22,6 +22,7 @@
 #include <linux/wait.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
+#include <linux/string.h>
 #include <sound/core.h>
 #include <sound/emux_synth.h>
 #include <linux/init.h>
@@ -76,7 +77,7 @@ int snd_emux_register(snd_emux_t *emu, s
 	snd_assert(name != NULL, return -EINVAL);
 
 	emu->card = card;
-	emu->name = snd_kmalloc_strdup(name, GFP_KERNEL);
+	emu->name = kstrdup(name, GFP_KERNEL);
 	emu->voices = kcalloc(emu->max_voices, sizeof(snd_emux_voice_t), GFP_KERNEL);
 	if (emu->voices == NULL)
 		return -ENOMEM;

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] create a kstrdup library function
  2005-04-04 19:44 [PATCH] create a kstrdup library function Paulo Marques
@ 2005-04-04 21:15 ` Adrian Bunk
  2005-04-05 11:17   ` Paulo Marques
  2005-04-04 21:49 ` Andres Salomon
  2005-04-13 11:23 ` Paulo Marques
  2 siblings, 1 reply; 6+ messages in thread
From: Adrian Bunk @ 2005-04-04 21:15 UTC (permalink / raw)
  To: Paulo Marques; +Cc: LKML, Andrew Morton

This patch contains a small bug:

<--  snip  -->

...
WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/net/sunrpc/sunrpc.ko needs 
unknown symbol kstrdup
WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/net/ipv6/ipv6.ko needs 
unknown symbol kstrdup
WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/drivers/parport/parport.ko 
needs unknown symbol kstrdup
WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/drivers/md/dm-mod.ko needs 
unknown symbol kstrdup

<--  snip  -->


Obvious fix:


Signed-off-by: Adrian Bunk <bunk@fs.tum.de>

--- linux-2.6.12-rc1-mm4-modular/lib/string.c.old	2005-04-04 23:07:33.000000000 +0200
+++ linux-2.6.12-rc1-mm4-modular/lib/string.c	2005-04-04 23:09:50.000000000 +0200
@@ -619,3 +619,4 @@
 		memcpy(buf, s, len);
 	return buf;
 }
+EXPORT_SYMBOL(kstrdup);

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] create a kstrdup library function
  2005-04-04 19:44 [PATCH] create a kstrdup library function Paulo Marques
  2005-04-04 21:15 ` Adrian Bunk
@ 2005-04-04 21:49 ` Andres Salomon
  2005-04-13 11:23 ` Paulo Marques
  2 siblings, 0 replies; 6+ messages in thread
From: Andres Salomon @ 2005-04-04 21:49 UTC (permalink / raw)
  To: linux-kernel

On Mon, 04 Apr 2005 20:44:17 +0100, Paulo Marques wrote:

> 
> Hi,
> 
> This patch creates a new kstrdup library function and changes the 
> "local" implementations in several places to use this function.
> 
> This is just a cleanup to allow reusing the strdup code, and to prevent 
> bugs in future duplications of strdup.
> 

Just a minor nit; I would use a size_t in kstrdup(),
instead of an int, for the len.  All other functions dealing w/ the len
(strlen, kmalloc, memcpy) expect a size_t.





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] create a kstrdup library function
  2005-04-04 21:15 ` Adrian Bunk
@ 2005-04-05 11:17   ` Paulo Marques
  2005-04-05 11:55     ` Paulo Marques
  0 siblings, 1 reply; 6+ messages in thread
From: Paulo Marques @ 2005-04-05 11:17 UTC (permalink / raw)
  To: Adrian Bunk; +Cc: LKML, Andrew Morton

Adrian Bunk wrote:
> This patch contains a small bug:
> 
> <--  snip  -->
> 
> ...
> WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/net/sunrpc/sunrpc.ko needs 
> unknown symbol kstrdup
> WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/net/ipv6/ipv6.ko needs 
> unknown symbol kstrdup
> WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/drivers/parport/parport.ko 
> needs unknown symbol kstrdup
> WARNING: /lib/modules/2.6.12-rc1-mm4/kernel/drivers/md/dm-mod.ko needs 
> unknown symbol kstrdup
> 
> <--  snip  -->

Damn, I did compile-test this thing, but didn't remember to compile even 
one of these as modules.

Andrew, do you want me to send a new patch with this fixed, so you can 
back out the current one and apply the new one, or can you simply merge 
this one from Adrian?

If I have to send a new patch, I might as well also fix the "int should 
be size_t" thing that Andres Salomon pointed out.

-- 
Paulo Marques - www.grupopie.com

All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke (1729 - 1797)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] create a kstrdup library function
  2005-04-05 11:17   ` Paulo Marques
@ 2005-04-05 11:55     ` Paulo Marques
  0 siblings, 0 replies; 6+ messages in thread
From: Paulo Marques @ 2005-04-05 11:55 UTC (permalink / raw)
  To: Paulo Marques; +Cc: Adrian Bunk, LKML, Andrew Morton

Paulo Marques wrote:
> Adrian Bunk wrote:
> 
>> This patch contains a small bug:
>>[...]
> Andrew, do you want me to send a new patch with this fixed, so you can 
> back out the current one and apply the new one, or can you simply merge 
> this one from Adrian?

Never mind, I can see the fix is already in rc2-mm1.

Thanks,

-- 
Paulo Marques - www.grupopie.com

All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke (1729 - 1797)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] create a kstrdup library function
  2005-04-04 19:44 [PATCH] create a kstrdup library function Paulo Marques
  2005-04-04 21:15 ` Adrian Bunk
  2005-04-04 21:49 ` Andres Salomon
@ 2005-04-13 11:23 ` Paulo Marques
  2 siblings, 0 replies; 6+ messages in thread
From: Paulo Marques @ 2005-04-13 11:23 UTC (permalink / raw)
  To: Paulo Marques; +Cc: LKML, Andrew Morton

Paulo Marques wrote:
> Hi,
> 
> This patch creates a new kstrdup library function and changes the 
> "local" implementations in several places to use this function.

Arkadiusz Miskiewicz reported that this breaks compilation under PPC.

Apparently, PPC builds a bootloader that links against lib.a but doesn't 
expect any dependencies on slab. Since kstrdup calls kmalloc, this 
breaks compilation.

I can fix this by moving kstrdup into slab.c. This way this is treated 
as an "allocation" function instead of a string function, so it makes 
some sense to do this.

Andrew, do you prefer an incremental patch against the current tree, or 
a single clean patch against the current tree with all the current 
kstrdup patches taken out?

-- 
Paulo Marques - www.grupopie.com

All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke (1729 - 1797)

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2005-04-13 11:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-04 19:44 [PATCH] create a kstrdup library function Paulo Marques
2005-04-04 21:15 ` Adrian Bunk
2005-04-05 11:17   ` Paulo Marques
2005-04-05 11:55     ` Paulo Marques
2005-04-04 21:49 ` Andres Salomon
2005-04-13 11:23 ` Paulo Marques

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox