diff options
author | Jindrich Novy <jnovy@dhcp-lab-186.brq.redhat.com> | 2008-03-23 13:51:53 +0100 |
---|---|---|
committer | Jindrich Novy <jnovy@dhcp-lab-186.brq.redhat.com> | 2008-03-23 13:51:53 +0100 |
commit | 3531bc5d8c356c56cc40b2a82b7a323981537995 (patch) | |
tree | d56b5a5a39c731db8bb3f2cf6c4bf8dbac305ecb /build | |
parent | a3ceec504b4af47b96f90d18dce9df861e0cb93c (diff) | |
download | rpm-3531bc5d8c356c56cc40b2a82b7a323981537995.tar.gz rpm-3531bc5d8c356c56cc40b2a82b7a323981537995.tar.bz2 rpm-3531bc5d8c356c56cc40b2a82b7a323981537995.zip |
Fix buffer overflow while creating patch script, avoid fixed sized buffers.
Diffstat (limited to 'build')
-rw-r--r-- | build/parsePrep.c | 87 |
1 files changed, 53 insertions, 34 deletions
diff --git a/build/parsePrep.c b/build/parsePrep.c index 759a89008..111153082 100644 --- a/build/parsePrep.c +++ b/build/parsePrep.c @@ -65,8 +65,10 @@ static char *doPatch(rpmSpec spec, int c, int strip, const char *db, { const char *fn; char *urlfn; - static char buf[BUFSIZ]; - char args[BUFSIZ], *t = args; + char *buf = NULL; + char *arg_backup = NULL; + char *arg_fuzz = NULL; + char *args = NULL; struct Source *sp; char *patcher; rpmCompressedMagic compressed = COMPRESSED_NOT; @@ -84,29 +86,28 @@ static char *doPatch(rpmSpec spec, int c, int strip, const char *db, urlfn = rpmGetPath("%{_sourcedir}/", sp->source, NULL); - *t = '\0'; - if (db) { -#if HAVE_OLDPATCH_21 == 0 - t = stpcpy(t, "-b "); -#endif - t = stpcpy( stpcpy(t, "--suffix "), db); - } - if (fuzz) { - t = stpcpy(t, " -F"); - sprintf(t, "%d", fuzz); - t += strlen(t); - } - if (reverse) - t = stpcpy(t, " -R"); - if (removeEmpties) - t = stpcpy(t, " -E"); - /* XXX On non-build parse's, file cannot be stat'd or read */ if (!spec->force && (rpmFileIsCompressed(urlfn, &compressed) || checkOwners(urlfn))) { urlfn = _free(urlfn); return NULL; } + if (db) { + rasprintf(&arg_backup, +#if HAVE_OLDPATCH_21 == 0 + "-b " +#endif + "--suffix %s", db); + } else arg_backup = xstrdup(""); + + if (fuzz) { + rasprintf(&arg_fuzz, " -F%d", fuzz); + } else arg_fuzz = xstrdup(""); + + rasprintf(&args, "%s%s%s%s", arg_backup, arg_fuzz, reverse ? " -R" : "", removeEmpties ? " -E" : ""); + free(arg_fuzz); + free(arg_backup); + fn = NULL; urltype = urlPath(urlfn, &fn); switch (urltype) { @@ -119,6 +120,7 @@ static char *doPatch(rpmSpec spec, int c, int strip, const char *db, break; case URL_IS_DASH: urlfn = _free(urlfn); + free(args); return NULL; break; } @@ -129,7 +131,7 @@ static char *doPatch(rpmSpec spec, int c, int strip, const char *db, (compressed == COMPRESSED_BZIP2 ? "%{__bzip2}" : "%{__gzip}"), NULL); - sprintf(buf, + rasprintf(&buf, "echo \"Patch #%d (%s):\"\n" "%s -d < '%s' | %s -p%d %s -s\n" "STATUS=$?\n" @@ -141,7 +143,7 @@ static char *doPatch(rpmSpec spec, int c, int strip, const char *db, fn, strip, args); zipper = _free(zipper); } else { - sprintf(buf, + rasprintf(&buf, "echo \"Patch #%d (%s):\"\n" "%s -p%d %s -s < '%s'", c, (const char *) basename(fn), patcher, strip, args, fn); @@ -294,7 +296,7 @@ static const char *doUntar(rpmSpec spec, int c, int quietly) */ static int doSetupMacro(rpmSpec spec, const char *line) { - char buf[BUFSIZ]; + char *buf = NULL; StringBuf before; StringBuf after; poptContext optCon; @@ -359,8 +361,7 @@ static int doSetupMacro(rpmSpec spec, const char *line) } else { const char *name, *version; (void) headerNVR(spec->packages->header, &name, &version, NULL); - sprintf(buf, "%s-%s", name, version); - spec->buildSubdir = xstrdup(buf); + rasprintf(&spec->buildSubdir, "%s-%s", name, version); } addMacro(spec->macros, "buildsubdir", NULL, spec->buildSubdir, RMIL_SPEC); @@ -372,22 +373,25 @@ static int doSetupMacro(rpmSpec spec, const char *line) const char *buildDir; (void) urlPath(buildDirURL, &buildDir); - sprintf(buf, "cd '%s'", buildDir); + rasprintf(&buf, "cd '%s'", buildDir); appendLineStringBuf(spec->prep, buf); + free(buf); buildDirURL = _free(buildDirURL); } /* delete any old sources */ if (!leaveDirs) { - sprintf(buf, "rm -rf '%s'", spec->buildSubdir); + rasprintf(&buf, "rm -rf '%s'", spec->buildSubdir); appendLineStringBuf(spec->prep, buf); + free(buf); } /* if necessary, create and cd into the proper dir */ if (createDir) { - sprintf(buf, RPM_MKDIR_P " %s\ncd '%s'", + rasprintf(&buf, RPM_MKDIR_P " %s\ncd '%s'", spec->buildSubdir, spec->buildSubdir); appendLineStringBuf(spec->prep, buf); + free(buf); } /* do the default action */ @@ -402,8 +406,9 @@ static int doSetupMacro(rpmSpec spec, const char *line) before = freeStringBuf(before); if (!createDir) { - sprintf(buf, "cd '%s'", spec->buildSubdir); + rasprintf(&buf, "cd '%s'", spec->buildSubdir); appendLineStringBuf(spec->prep, buf); + free(buf); } if (createDir && !skipDefaultAction) { @@ -444,7 +449,7 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) char *opt_b; int opt_P, opt_p, opt_R, opt_E, opt_F; char *s; - char buf[BUFSIZ], *bp; + char *buf = NULL, *bp; int patch_nums[1024]; /* XXX - we can only handle 1024 patches! */ int patch_index, x; @@ -455,9 +460,9 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) if (! strchr(" \t\n", line[6])) { /* %patchN */ - sprintf(buf, "%%patch -P %s", line + 6); + rasprintf(&buf, "%%patch -P %s", line + 6); } else { - strcpy(buf, line); + buf = xstrdup(line); } /* FIX: strtok has state */ @@ -479,6 +484,7 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) rpmlog(RPMLOG_ERR, _("line %d: Need arg to %%patch -b: %s\n"), spec->lineNum, spec->line); + free(buf); return RPMRC_FAIL; } } else if (!strcmp(s, "-z")) { @@ -488,6 +494,7 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) rpmlog(RPMLOG_ERR, _("line %d: Need arg to %%patch -z: %s\n"), spec->lineNum, spec->line); + free(buf); return RPMRC_FAIL; } } else if (!strncmp(s, "-F", strlen("-F"))) { @@ -505,6 +512,7 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) rpmlog(RPMLOG_ERR, _("line %d: Bad arg to %%patch -F: %s\n"), spec->lineNum, spec->line); + free(buf); return RPMRC_FAIL; } } else if (!strncmp(s, "-p", sizeof("-p")-1)) { @@ -517,6 +525,7 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) rpmlog(RPMLOG_ERR, _("line %d: Need arg to %%patch -p: %s\n"), spec->lineNum, spec->line); + free(buf); return RPMRC_FAIL; } } @@ -524,17 +533,20 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) rpmlog(RPMLOG_ERR, _("line %d: Bad arg to %%patch -p: %s\n"), spec->lineNum, spec->line); + free(buf); return RPMRC_FAIL; } } else { /* Must be a patch num */ if (patch_index == 1024) { rpmlog(RPMLOG_ERR, _("Too many patches!\n")); + free(buf); return RPMRC_FAIL; } if (parseNum(s, &(patch_nums[patch_index]))) { rpmlog(RPMLOG_ERR, _("line %d: Bad arg to %%patch: %s\n"), spec->lineNum, spec->line); + free(buf); return RPMRC_FAIL; } patch_index++; @@ -545,18 +557,25 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line) if (! opt_P) { s = doPatch(spec, 0, opt_p, opt_b, opt_R, opt_E, opt_F); - if (s == NULL) + if (s == NULL) { + free(buf); return RPMRC_FAIL; + } appendLineStringBuf(spec->prep, s); + free(s); } for (x = 0; x < patch_index; x++) { s = doPatch(spec, patch_nums[x], opt_p, opt_b, opt_R, opt_E, opt_F); - if (s == NULL) + if (s == NULL) { + free(buf); return RPMRC_FAIL; + } appendLineStringBuf(spec->prep, s); + free(s); } - + + free(buf); return RPMRC_OK; } |