summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorAndrey Panin <pazke@donpac.ru>2005-09-06 15:18:28 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-07 16:57:44 -0700
commitc3c7120d552989be94c9137989be5abb6da8954f (patch)
tree0d68ff5c4586b1514443a61918f4c52024d60157 /arch
parent4e70b9a3d68909ad7e79bf6e1b0dcec6de922a7c (diff)
[PATCH] dmi: make dmi_string() behave like strdup()
This patch changes dmi_string() function to allocate string copy by itself, to avoid code duplication in the next patch. Signed-off-by: Andrey Panin <pazke@donpac.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/dmi_scan.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c
index ecdaae262755..ae1a1aed2fc0 100644
--- a/arch/i386/kernel/dmi_scan.c
+++ b/arch/i386/kernel/dmi_scan.c
@@ -16,15 +16,25 @@ struct dmi_header {
static char * __init dmi_string(struct dmi_header *dm, u8 s)
{
u8 *bp = ((u8 *) dm) + dm->length;
+ char *str = "";
- if (!s)
- return "";
- s--;
- while (s > 0 && *bp) {
- bp += strlen(bp) + 1;
+ if (s) {
s--;
- }
- return bp;
+ while (s > 0 && *bp) {
+ bp += strlen(bp) + 1;
+ s--;
+ }
+
+ if (*bp != 0) {
+ str = alloc_bootmem(strlen(bp) + 1);
+ if (str != NULL)
+ strcpy(str, bp);
+ else
+ printk(KERN_ERR "dmi_string: out of memory.\n");
+ }
+ }
+
+ return str;
}
/*
@@ -84,19 +94,16 @@ static char *dmi_ident[DMI_STRING_MAX];
*/
static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string)
{
- char *d = (char*)dm;
- char *p = dmi_string(dm, d[string]);
+ char *p, *d = (char*) dm;
- if (p == NULL || *p == 0)
- return;
if (dmi_ident[slot])
return;
- dmi_ident[slot] = alloc_bootmem(strlen(p) + 1);
- if(dmi_ident[slot])
- strcpy(dmi_ident[slot], p);
- else
- printk(KERN_ERR "dmi_save_ident: out of memory.\n");
+ p = dmi_string(dm, d[string]);
+ if (p == NULL)
+ return;
+
+ dmi_ident[slot] = p;
}
/*