98 lines
3.4 KiB
Diff
98 lines
3.4 KiB
Diff
Handle invalid paper specifications.
|
|
|
|
Taken from upstream:
|
|
|
|
https://github.com/rrthomas/libpaper/commit/24bcaa54e2813683404e3e13a4fedd47f3e4d614
|
|
|
|
diff --git a/lib/libpaper.c.in.in b/lib/libpaper.c.in.in
|
|
index 19e3332..c68a936 100644
|
|
--- a/lib/libpaper.c.in.in
|
|
+++ b/lib/libpaper.c.in.in
|
|
@@ -164,10 +164,8 @@ const struct paper *papernext(const struct paper *paper)
|
|
}
|
|
|
|
/* Constructor. */
|
|
-static int readspecs(struct paper **papers_list, const char *specsfile, struct paper **last) {
|
|
- paper_lineno = 0;
|
|
- free(paper_specsfile);
|
|
- paper_specsfile = strdup(specsfile);
|
|
+static int readspecs(struct paper **papers_list, const char *specsfile, struct paper **last, size_t *lineno) {
|
|
+ *lineno = 0;
|
|
char *old_locale = setlocale(LC_ALL, NULL);
|
|
if (old_locale != NULL)
|
|
old_locale = strdup(old_locale);
|
|
@@ -178,7 +176,7 @@ static int readspecs(struct paper **papers_list, const char *specsfile, struct p
|
|
struct paper *prev = *papers_list, *p;
|
|
size_t n;
|
|
char *l;
|
|
- for (paper_lineno = 1, l = NULL; getline(&l, &n, ps) > 0; prev = p, paper_lineno++) {
|
|
+ for (*lineno = 1, l = NULL; getline(&l, &n, ps) > 0; prev = p, (*lineno)++) {
|
|
char *saveptr;
|
|
char *name = gettok(l, &saveptr);
|
|
char *wstr = gettok(NULL, &saveptr), *hstr = gettok(NULL, &saveptr);
|
|
@@ -350,6 +348,8 @@ int paperinit(void)
|
|
return PAPER_OK;
|
|
initialized = true;
|
|
|
|
+ int ret = PAPER_OK;
|
|
+
|
|
/* Read system paperspecs. */
|
|
struct paper *system_papers = NULL;
|
|
sysconfdir = alloc_relocate("@sysconfdir@");
|
|
@@ -357,12 +357,9 @@ int paperinit(void)
|
|
char *system_paperspecs = mfile_name_concat(sysconfdir, PAPERSPECS_FILENAME, NULL);
|
|
if (system_paperspecs == NULL)
|
|
return PAPER_NOMEM;
|
|
- int ret = readspecs(&system_papers, system_paperspecs, NULL);
|
|
- free(system_paperspecs);
|
|
- if (ret != PAPER_OK) {
|
|
- paperdone();
|
|
- return ret;
|
|
- }
|
|
+ ret = readspecs(&system_papers, system_paperspecs, NULL, &paper_lineno);
|
|
+ free(paper_specsfile);
|
|
+ paper_specsfile = system_paperspecs;
|
|
}
|
|
|
|
/* Set default paper to first system paper, if any. */
|
|
@@ -381,11 +378,15 @@ int paperinit(void)
|
|
char *user_paperspecs = mfile_name_concat(xdg_config_home, PAPERSPECS_FILENAME, NULL);
|
|
struct paper *last_paper = NULL;
|
|
if (user_paperspecs != NULL) {
|
|
- int ret = readspecs(&papers, user_paperspecs, &last_paper);
|
|
- free(user_paperspecs);
|
|
- if (ret != PAPER_OK) {
|
|
- paperdone();
|
|
- return ret;
|
|
+ size_t user_lineno;
|
|
+ int user_ret = readspecs(&papers, user_paperspecs, &last_paper, &user_lineno);
|
|
+ if (ret == PAPER_OK) {
|
|
+ ret = user_ret;
|
|
+ free(user_paperspecs);
|
|
+ } else if (paper_lineno == 0) {
|
|
+ free(paper_specsfile);
|
|
+ paper_specsfile = user_paperspecs;
|
|
+ paper_lineno = user_lineno;
|
|
}
|
|
}
|
|
|
|
@@ -395,13 +396,16 @@ int paperinit(void)
|
|
default_paper = papers;
|
|
|
|
/* Concatenate system papers to user papers. */
|
|
- last_paper->next = system_papers;
|
|
+ if (last_paper != NULL)
|
|
+ last_paper->next = system_papers;
|
|
+ else
|
|
+ last_paper = system_papers;
|
|
}
|
|
|
|
if (papers == NULL) /* System papers are all we have. */
|
|
papers = system_papers;
|
|
|
|
- return PAPER_OK;
|
|
+ return ret;
|
|
}
|
|
|
|
/* Shut down the library. */
|