patch: Bring in xstrdup and use it when appropriate.

The function savestr allows NULL return values during Plan A patching so in
case of out of memory conditions, Plan B can step in.  In many cases, NULL
value is not properly handled, so use xstrdup here (it's outside Plan A/B
patching, which means that even Plan B relies on successful operations).

Clean up some whitespaces while here

Obtained from:	OpenBSD
MFC after:	2 weeks
This commit is contained in:
Pedro F. Giffuni 2014-12-25 21:51:28 +00:00
parent f188f14d43
commit 547e0acbec
4 changed files with 35 additions and 18 deletions

View File

@ -23,7 +23,7 @@
* -C option added in 1998, original code by Marc Espie, based on FreeBSD
* behaviour
*
* $OpenBSD: patch.c,v 1.52 2014/11/26 18:34:51 millert Exp $
* $OpenBSD: patch.c,v 1.54 2014/12/13 10:31:07 tobias Exp $
* $FreeBSD$
*
*/
@ -215,13 +215,13 @@ main(int argc, char *argv[])
for (open_patch_file(filearg[1]); there_is_another_patch();
reinitialize_almost_everything()) {
/* for each patch in patch file */
patch_seen = true;
warn_on_invalid_line = true;
if (outname == NULL)
outname = savestr(filearg[0]);
outname = xstrdup(filearg[0]);
/* for ed script just up and do it and exit */
if (diff_type == ED_DIFF) {
@ -416,7 +416,7 @@ main(int argc, char *argv[])
}
set_signals(1);
}
if (!patch_seen)
error = 2;
@ -514,10 +514,10 @@ get_some_switches(void)
/* FALLTHROUGH */
case 'z':
/* must directly follow 'b' case for backwards compat */
simple_backup_suffix = savestr(optarg);
simple_backup_suffix = xstrdup(optarg);
break;
case 'B':
origprae = savestr(optarg);
origprae = xstrdup(optarg);
break;
case 'c':
diff_type = CONTEXT_DIFF;
@ -555,7 +555,7 @@ get_some_switches(void)
case 'i':
if (++filec == MAXFILEC)
fatal("too many file arguments\n");
filearg[filec] = savestr(optarg);
filearg[filec] = xstrdup(optarg);
break;
case 'l':
canonicalize = true;
@ -567,7 +567,7 @@ get_some_switches(void)
noreverse = true;
break;
case 'o':
outname = savestr(optarg);
outname = xstrdup(optarg);
break;
case 'p':
strippath = atoi(optarg);
@ -611,12 +611,12 @@ get_some_switches(void)
Argv += optind;
if (Argc > 0) {
filearg[0] = savestr(*Argv++);
filearg[0] = xstrdup(*Argv++);
Argc--;
while (Argc > 0) {
if (++filec == MAXFILEC)
fatal("too many file arguments\n");
filearg[filec] = savestr(*Argv++);
filearg[filec] = xstrdup(*Argv++);
Argc--;
}
}

View File

@ -205,14 +205,14 @@ there_is_another_patch(void)
while (filearg[0] == NULL) {
if (force || batch) {
say("No file to patch. Skipping...\n");
filearg[0] = savestr(bestguess);
filearg[0] = xstrdup(bestguess);
skip_rest_of_patch = true;
return true;
}
ask("File to patch: ");
if (*buf != '\n') {
free(bestguess);
bestguess = savestr(buf);
bestguess = xstrdup(buf);
filearg[0] = fetchname(buf, &exists, 0);
}
if (!exists) {
@ -319,7 +319,7 @@ intuit_diff_type(void)
else if (strnEQ(s, "Prereq:", 7)) {
for (t = s + 7; isspace((unsigned char)*t); t++)
;
revision = savestr(t);
revision = xstrdup(t);
for (t = revision;
*t && !isspace((unsigned char)*t); t++)
;
@ -403,7 +403,7 @@ intuit_diff_type(void)
free(bestguess);
bestguess = NULL;
if (filearg[0] != NULL)
bestguess = savestr(filearg[0]);
bestguess = xstrdup(filearg[0]);
else if (!ok_to_create_file) {
/*
* We don't want to create a new file but we need a
@ -1505,7 +1505,7 @@ posix_name(const struct file_name *names, bool assume_exists)
path = names[NEW_FILE].path;
}
return path ? savestr(path) : NULL;
return path ? xstrdup(path) : NULL;
}
static char *
@ -1571,7 +1571,7 @@ best_name(const struct file_name *names, bool assume_exists)
best = names[NEW_FILE].path;
}
return best ? savestr(best) : NULL;
return best ? xstrdup(best) : NULL;
}
static size_t
@ -1613,7 +1613,7 @@ strtolinenum(char *nptr, char **endptr)
if (errstr != NULL)
fatal("invalid line number at line %ld: `%s' is %s\n",
p_input_line, nptr, errstr);
*p = c;
*endptr = p;

View File

@ -201,6 +201,22 @@ savestr(const char *s)
return rv;
}
/*
* Allocate a unique area for a string. Call fatal if out of memory.
*/
char *
xstrdup(const char *s)
{
char *rv;
if (!s)
s = "Oops";
rv = strdup(s);
if (rv == NULL)
fatal("out of memory\n");
return rv;
}
/*
* Vanilla terminal output (buffered).
*/

View File

@ -23,7 +23,7 @@
* -C option added in 1998, original code by Marc Espie, based on FreeBSD
* behaviour
*
* $OpenBSD: util.h,v 1.15 2005/06/20 07:14:06 otto Exp $
* $OpenBSD: util.h,v 1.16 2014/12/13 10:31:07 tobias Exp $
* $FreeBSD$
*/
@ -41,6 +41,7 @@ void pfatal(const char *, ...)
void ask(const char *, ...)
__attribute__((__format__(__printf__, 1, 2)));
char *savestr(const char *);
char *xstrdup(const char *);
void set_signals(int);
void ignore_signals(void);
void makedirs(const char *, bool);