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:
parent
f188f14d43
commit
547e0acbec
@ -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--;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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).
|
||||
*/
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user