summaryrefslogtreecommitdiff
path: root/modutils
diff options
context:
space:
mode:
authorDenys Vlasenko2011-02-13 04:17:35 +0100
committerDenys Vlasenko2011-02-13 04:17:35 +0100
commit07cda2268a6cff59378af16eabc4968d9bebe915 (patch)
treea744208b75f57c6005991e8676aff95ff67d200f /modutils
parent9a5b7f636dad35ac84056768b3669bdca02d2700 (diff)
downloadbusybox-07cda2268a6cff59378af16eabc4968d9bebe915.zip
busybox-07cda2268a6cff59378af16eabc4968d9bebe915.tar.gz
fix bug 3223 (parameter loading problem for 2.4 kernels)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'modutils')
-rw-r--r--modutils/modutils-24.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/modutils/modutils-24.c b/modutils/modutils-24.c
index 2b34954..bbc54e3 100644
--- a/modutils/modutils-24.c
+++ b/modutils/modutils-24.c
@@ -2444,14 +2444,12 @@ new_process_module_arguments(struct obj_file *f, const char *options)
bb_error_msg_and_die("symbol for parameter %s not found", param);
/* Number of parameters */
+ min = max = 1;
if (isdigit(*pinfo)) {
- min = strtoul(pinfo, &pinfo, 10);
+ min = max = strtoul(pinfo, &pinfo, 10);
if (*pinfo == '-')
max = strtoul(pinfo + 1, &pinfo, 10);
- else
- max = min;
- } else
- min = max = 1;
+ }
contents = f->sections[sym->secidx]->contents;
loc = contents + sym->value;
@@ -2473,7 +2471,8 @@ new_process_module_arguments(struct obj_file *f, const char *options)
/* Parse parameter values */
n = 0;
p = val;
- while (*p != 0) {
+ while (*p) {
+ char sv_ch;
char *endp;
if (++n > max)
@@ -2482,21 +2481,25 @@ new_process_module_arguments(struct obj_file *f, const char *options)
switch (*pinfo) {
case 's':
len = strcspn(p, ",");
- p[len] = 0;
+ sv_ch = p[len];
+ p[len] = '\0';
obj_string_patch(f, sym->secidx,
loc - contents, p);
loc += tgt_sizeof_char_p;
p += len;
+ *p = sv_ch;
break;
case 'c':
len = strcspn(p, ",");
- p[len] = 0;
+ sv_ch = p[len];
+ p[len] = '\0';
if (len >= charssize)
bb_error_msg_and_die("string too long for %s (max %ld)", param,
charssize - 1);
strcpy((char *) loc, p);
loc += charssize;
p += len;
+ *p = sv_ch;
break;
case 'b':
*loc++ = strtoul(p, &endp, 0);