| From 61838b0fdacb71a881baac164043b8e40ddfbec5 Mon Sep 17 00:00:00 2001 |
| From: Tom Hughes <tom@compton.nu> |
| Date: Tue, 17 Nov 2015 17:36:16 +0000 |
| Subject: [PATCH] Remove size limit when expanding macros |
| |
| This removes a seemingly undocumented, and not even well defined, limit |
| on the size of a macro expansion when parsing a spec file. |
| |
| [lkardos@redhat.com: created new funtion expandMacrosU() (Unlimited) |
| instead of modifying expandMacros() in order not to change API/ABI] |
| |
| Signed-off-by: Lubos Kardos <lkardos@redhat.com> |
| |
| build/files.c | 6 ++++-- |
| build/pack.c | 6 ++++-- |
| build/parseSpec.c | 10 ++++++---- |
| rpmio/macro.c | 17 +++++++++++++++++ |
| rpmio/rpmmacro.h | 12 ++++++++++++ |
| 5 files changed, 43 insertions(+), 8 deletions(-) |
| |
| diff --git a/build/files.c b/build/files.c |
| index ea595b9..2fc434e 100644 |
| |
| |
| @@ -1631,11 +1631,13 @@ static rpmRC readFilesManifest(rpmSpec spec, Package pkg, const char *path) |
| while (fgets(buf, sizeof(buf), fd)) { |
| if (handleComments(buf)) |
| continue; |
| - if (expandMacros(spec, spec->macros, buf, sizeof(buf))) { |
| + char *expanded = expandMacrosU(spec, spec->macros, buf); |
| + if (expanded == NULL) { |
| rpmlog(RPMLOG_ERR, _("line: %s\n"), buf); |
| goto exit; |
| } |
| - argvAdd(&(pkg->fileList), buf); |
| + argvAdd(&(pkg->fileList), expanded); |
| + free(expanded); |
| nlines++; |
| } |
| |
| diff --git a/build/pack.c b/build/pack.c |
| index 213d85e..6ffe450 100644 |
| |
| |
| @@ -132,11 +132,13 @@ static rpmRC addFileToTag(rpmSpec spec, const char * file, |
| } |
| |
| while (fgets(buf, sizeof(buf), f)) { |
| - if (expandMacros(spec, spec->macros, buf, sizeof(buf))) { |
| + char *expanded = expandMacrosU(spec, spec->macros, buf); |
| + if (expanded == NULL) { |
| rpmlog(RPMLOG_ERR, _("%s: line: %s\n"), fn, buf); |
| goto exit; |
| } |
| - appendStringBuf(sb, buf); |
| + appendStringBuf(sb, expanded); |
| + free(expanded); |
| } |
| headerPutString(h, tag, getStringBuf(sb)); |
| rc = RPMRC_OK; |
| diff --git a/build/parseSpec.c b/build/parseSpec.c |
| index edc3d00..610e371 100644 |
| |
| |
| @@ -180,13 +180,15 @@ static int expandMacrosInSpecBuf(rpmSpec spec, int strip) |
| if (lbuf[0] == '#') |
| isComment = 1; |
| |
| - lbuf = xstrdup(spec->lbuf); |
| + lbuf = spec->lbuf; |
| |
| - rc = expandMacros(spec, spec->macros, spec->lbuf, spec->lbufSize); |
| - if (rc) { |
| + spec->lbuf = expandMacrosU(spec, spec->macros, lbuf); |
| + if (spec->lbuf == NULL) { |
| rpmlog(RPMLOG_ERR, _("line %d: %s\n"), |
| - spec->lineNum, spec->lbuf); |
| + spec->lineNum, lbuf); |
| goto exit; |
| + } else { |
| + spec->lbufSize = strlen(spec->lbuf) + 1; |
| } |
| |
| if (strip & STRIP_COMMENTS && isComment) { |
| diff --git a/rpmio/macro.c b/rpmio/macro.c |
| index 4b3c41b..4c8934e 100644 |
| |
| |
| @@ -1471,6 +1471,23 @@ int expandMacros(void * spec, rpmMacroContext mc, char * sbuf, size_t slen) |
| return rc; |
| } |
| |
| +char *expandMacrosU(void * spec, rpmMacroContext mc, char * sbuf) |
| +{ |
| + char *target = NULL; |
| + int rc; |
| + |
| + mc = rpmmctxAcquire(mc); |
| + rc = doExpandMacros(mc, sbuf, &target); |
| + rpmmctxRelease(mc); |
| + |
| + if (rc) { |
| + free(target); |
| + target = NULL; |
| + } |
| + |
| + return target; |
| +} |
| + |
| void |
| rpmDumpMacroTable(rpmMacroContext mc, FILE * fp) |
| { |
| diff --git a/rpmio/rpmmacro.h b/rpmio/rpmmacro.h |
| index 765c78c..a4884b0 100644 |
| |
| |
| @@ -66,6 +66,18 @@ int expandMacros (void * spec, rpmMacroContext mc, |
| size_t slen); |
| |
| /** \ingroup rpmmacro |
| + * Expand macro into buffer. |
| + * @deprecated Use rpmExpand(). |
| + * @todo Eliminate from API. |
| + * @param spec cookie (unused) |
| + * @param mc macro context (NULL uses global context). |
| + * @retval sbuf input macro to expand |
| + * @return macro expansion (malloc'ed) or NULL on failure |
| + */ |
| +char *expandMacrosU (void * spec, rpmMacroContext mc, |
| + char * sbuf); |
| + |
| +/** \ingroup rpmmacro |
| * Add macro to context. |
| * @deprecated Use rpmDefineMacro(). |
| * @param mc macro context (NULL uses global context). |
| -- |
| 1.9.3 |
| |
| From aee8446eb498fec7bfd7a2848ab97440b7bb7226 Mon Sep 17 00:00:00 2001 |
| From: Tom Hughes <tom@compton.nu> |
| Date: Mon, 23 Nov 2015 09:38:37 +0000 |
| Subject: [PATCH 1/2] Rename expandMacrosU to rpmExpandMacros |
| |
| Address review issues from #32 by renaming the function and |
| cleaning up the comment and parameter list. |
| |
| build/files.c | 2 +- |
| build/pack.c | 2 +- |
| build/parseSpec.c | 2 +- |
| rpmio/macro.c | 2 +- |
| rpmio/rpmmacro.h | 10 ++++------ |
| 5 files changed, 8 insertions(+), 10 deletions(-) |
| |
| diff --git a/build/files.c b/build/files.c |
| index 4d49449..0bc4acc 100644 |
| |
| |
| @@ -1624,7 +1624,7 @@ static rpmRC readFilesManifest(rpmSpec spec, Package pkg, const char *path) |
| while (fgets(buf, sizeof(buf), fd)) { |
| if (handleComments(buf)) |
| continue; |
| - char *expanded = expandMacrosU(spec, spec->macros, buf); |
| + char *expanded = rpmExpandMacros(spec->macros, buf, 0); |
| if (expanded == NULL) { |
| rpmlog(RPMLOG_ERR, _("line: %s\n"), buf); |
| goto exit; |
| diff --git a/build/pack.c b/build/pack.c |
| index 6ffe450..ec06bc8 100644 |
| |
| |
| @@ -132,7 +132,7 @@ static rpmRC addFileToTag(rpmSpec spec, const char * file, |
| } |
| |
| while (fgets(buf, sizeof(buf), f)) { |
| - char *expanded = expandMacrosU(spec, spec->macros, buf); |
| + char *expanded = rpmExpandMacros(spec->macros, buf, 0); |
| if (expanded == NULL) { |
| rpmlog(RPMLOG_ERR, _("%s: line: %s\n"), fn, buf); |
| goto exit; |
| diff --git a/build/parseSpec.c b/build/parseSpec.c |
| index 610e371..6171bb0 100644 |
| |
| |
| @@ -182,7 +182,7 @@ static int expandMacrosInSpecBuf(rpmSpec spec, int strip) |
| |
| lbuf = spec->lbuf; |
| |
| - spec->lbuf = expandMacrosU(spec, spec->macros, lbuf); |
| + spec->lbuf = rpmExpandMacros(spec->macros, lbuf, 0); |
| if (spec->lbuf == NULL) { |
| rpmlog(RPMLOG_ERR, _("line %d: %s\n"), |
| spec->lineNum, lbuf); |
| diff --git a/rpmio/macro.c b/rpmio/macro.c |
| index 4c8934e..f9ca027 100644 |
| |
| |
| @@ -1471,7 +1471,7 @@ int expandMacros(void * spec, rpmMacroContext mc, char * sbuf, size_t slen) |
| return rc; |
| } |
| |
| -char *expandMacrosU(void * spec, rpmMacroContext mc, char * sbuf) |
| +char *rpmExpandMacros(rpmMacroContext mc, const char * sbuf, int flags) |
| { |
| char *target = NULL; |
| int rc; |
| diff --git a/rpmio/rpmmacro.h b/rpmio/rpmmacro.h |
| index a4884b0..f5ddcac 100644 |
| |
| |
| @@ -67,15 +67,13 @@ int expandMacros (void * spec, rpmMacroContext mc, |
| |
| /** \ingroup rpmmacro |
| * Expand macro into buffer. |
| - * @deprecated Use rpmExpand(). |
| - * @todo Eliminate from API. |
| - * @param spec cookie (unused) |
| * @param mc macro context (NULL uses global context). |
| - * @retval sbuf input macro to expand |
| + * @param sbuf input macro to expand |
| + * @param flags flags (currently unused) |
| * @return macro expansion (malloc'ed) or NULL on failure |
| */ |
| -char *expandMacrosU (void * spec, rpmMacroContext mc, |
| - char * sbuf); |
| +char *rpmExpandMacros (rpmMacroContext mc, const char * sbuf, |
| + int flags); |
| |
| /** \ingroup rpmmacro |
| * Add macro to context. |
| -- |
| 1.9.3 |
| |
| From ddf9ec7befe83ba1a12453a56e4e471aa9bcf4d3 Mon Sep 17 00:00:00 2001 |
| From: Lubos Kardos <lkardos@redhat.com> |
| Date: Thu, 26 Nov 2015 15:20:05 +0100 |
| Subject: [PATCH 2/2] rpmExpandMacros() is modified to be able to return more |
| return codes |
| |
| Now rpmExpandMacros() returns integer as a return value. Negative return |
| value implies failure. Return values can be more utilized in the future. |
| E. g. return value could specify how many macros were expanded in given |
| string. |
| |
| build/files.c | 4 ++-- |
| build/pack.c | 4 ++-- |
| build/parseSpec.c | 21 +++++++++------------ |
| rpmio/macro.c | 9 +++++---- |
| rpmio/rpmmacro.h | 7 ++++--- |
| 5 files changed, 22 insertions(+), 23 deletions(-) |
| |
| diff --git a/build/files.c b/build/files.c |
| index 0bc4acc..d00a785 100644 |
| |
| |
| @@ -1604,6 +1604,7 @@ static rpmRC readFilesManifest(rpmSpec spec, Package pkg, const char *path) |
| FILE *fd = NULL; |
| rpmRC rc = RPMRC_FAIL; |
| unsigned int nlines = 0; |
| + char *expanded; |
| |
| if (*path == '/') { |
| fn = rpmGetPath(path, NULL); |
| @@ -1624,8 +1625,7 @@ static rpmRC readFilesManifest(rpmSpec spec, Package pkg, const char *path) |
| while (fgets(buf, sizeof(buf), fd)) { |
| if (handleComments(buf)) |
| continue; |
| - char *expanded = rpmExpandMacros(spec->macros, buf, 0); |
| - if (expanded == NULL) { |
| + if(rpmExpandMacros(spec->macros, buf, &expanded, 0) < 0) { |
| rpmlog(RPMLOG_ERR, _("line: %s\n"), buf); |
| goto exit; |
| } |
| diff --git a/build/pack.c b/build/pack.c |
| index ec06bc8..bfb4c73 100644 |
| |
| |
| @@ -132,8 +132,8 @@ static rpmRC addFileToTag(rpmSpec spec, const char * file, |
| } |
| |
| while (fgets(buf, sizeof(buf), f)) { |
| - char *expanded = rpmExpandMacros(spec->macros, buf, 0); |
| - if (expanded == NULL) { |
| + char *expanded; |
| + if(rpmExpandMacros(spec->macros, buf, &expanded, 0) < 0) { |
| rpmlog(RPMLOG_ERR, _("%s: line: %s\n"), fn, buf); |
| goto exit; |
| } |
| diff --git a/build/parseSpec.c b/build/parseSpec.c |
| index 6171bb0..9fff0e2 100644 |
| |
| |
| @@ -169,7 +169,7 @@ static int restoreFirstChar(rpmSpec spec) |
| static int expandMacrosInSpecBuf(rpmSpec spec, int strip) |
| { |
| char *lbuf = NULL; |
| - int rc = 0, isComment = 0; |
| + int isComment = 0; |
| |
| /* Don't expand macros (eg. %define) in false branch of %if clause */ |
| if (!spec->readStack->reading) |
| @@ -180,17 +180,17 @@ static int expandMacrosInSpecBuf(rpmSpec spec, int strip) |
| if (lbuf[0] == '#') |
| isComment = 1; |
| |
| - lbuf = spec->lbuf; |
| |
| - spec->lbuf = rpmExpandMacros(spec->macros, lbuf, 0); |
| - if (spec->lbuf == NULL) { |
| + if(rpmExpandMacros(spec->macros, spec->lbuf, &lbuf, 0) < 0) { |
| rpmlog(RPMLOG_ERR, _("line %d: %s\n"), |
| - spec->lineNum, lbuf); |
| - goto exit; |
| - } else { |
| - spec->lbufSize = strlen(spec->lbuf) + 1; |
| + spec->lineNum, spec->lbuf); |
| + return 1; |
| } |
| |
| + free(spec->lbuf); |
| + spec->lbuf = lbuf; |
| + spec->lbufSize = strlen(spec->lbuf) + 1; |
| + |
| if (strip & STRIP_COMMENTS && isComment) { |
| char *bufA = lbuf; |
| char *bufB = spec->lbuf; |
| @@ -212,10 +212,7 @@ static int expandMacrosInSpecBuf(rpmSpec spec, int strip) |
| spec->lineNum, lbuf); |
| } |
| |
| -exit: |
| - free(lbuf); |
| - |
| - return rc; |
| + return 0; |
| } |
| |
| /* Return zero on success, 1 if we need to read more and -1 on errors. */ |
| diff --git a/rpmio/macro.c b/rpmio/macro.c |
| index f9ca027..0c009ea 100644 |
| |
| |
| @@ -1471,7 +1471,7 @@ int expandMacros(void * spec, rpmMacroContext mc, char * sbuf, size_t slen) |
| return rc; |
| } |
| |
| -char *rpmExpandMacros(rpmMacroContext mc, const char * sbuf, int flags) |
| +int rpmExpandMacros(rpmMacroContext mc, const char * sbuf, char ** obuf, int flags) |
| { |
| char *target = NULL; |
| int rc; |
| @@ -1482,10 +1482,11 @@ char *rpmExpandMacros(rpmMacroContext mc, const char * sbuf, int flags) |
| |
| if (rc) { |
| free(target); |
| - target = NULL; |
| + return -1; |
| + } else { |
| + *obuf = target; |
| + return 1; |
| } |
| - |
| - return target; |
| } |
| |
| void |
| diff --git a/rpmio/rpmmacro.h b/rpmio/rpmmacro.h |
| index f5ddcac..8027f98 100644 |
| |
| |
| @@ -69,11 +69,12 @@ int expandMacros (void * spec, rpmMacroContext mc, |
| * Expand macro into buffer. |
| * @param mc macro context (NULL uses global context). |
| * @param sbuf input macro to expand |
| + * @param obuf macro expansion (malloc'ed) |
| * @param flags flags (currently unused) |
| - * @return macro expansion (malloc'ed) or NULL on failure |
| + * @return negative on failure |
| */ |
| -char *rpmExpandMacros (rpmMacroContext mc, const char * sbuf, |
| - int flags); |
| +int rpmExpandMacros (rpmMacroContext mc, const char * sbuf, |
| + char ** obuf, int flags); |
| |
| /** \ingroup rpmmacro |
| * Add macro to context. |
| -- |
| 1.9.3 |
| |