aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages/patches/libpaper-invalid-paperspecs.patch
blob: 29f1ca64a352e357204a4d35dd564579071b28b9 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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. */