]> git.pld-linux.org Git - packages/rpm.git/blob - rpm-fast-alAddPackage.patch
- fixed segv
[packages/rpm.git] / rpm-fast-alAddPackage.patch
1 --- ./lib/depends.c.org Mon Jun 25 17:59:49 2001
2 +++ ./lib/depends.c     Mon Jun 25 18:04:00 2001
3 @@ -335,18 +335,21 @@
4         for (dirNum = 0; dirNum < numDirs; dirNum++) {
5             dirNeedle.dirName = (char *) dirNames[dirNum];
6             dirNeedle.dirNameLen = strlen(dirNames[dirNum]);
7 -           dirMatch = bsearch(&dirNeedle, al->dirs, origNumDirs,
8 +           dirMatch = bsearchnl(&dirNeedle, al->dirs, al->numDirs,
9                                sizeof(dirNeedle), dirInfoCompare);
10 -           if (dirMatch) {
11 -               dirMapping[dirNum] = dirMatch - al->dirs;
12 -           } else {
13 -               dirMapping[dirNum] = al->numDirs;
14 -               al->dirs[al->numDirs].dirName = xstrdup(dirNames[dirNum]);
15 -               al->dirs[al->numDirs].dirNameLen = strlen(dirNames[dirNum]);
16 -               al->dirs[al->numDirs].files = NULL;
17 -               al->dirs[al->numDirs].numFiles = 0;
18 +           if (dirMatch==NULL || dirInfoCompare(dirMatch, &dirNeedle)!=0) {
19 +               if(dirMatch==NULL)
20 +                       dirMatch=al->dirs+al->numDirs;
21 +               memmove(dirMatch+1, dirMatch, 
22 +                       ((al->dirs+al->numDirs) - dirMatch)*sizeof(*al->dirs));
23 +               dirMatch->dirName = xstrdup(dirNames[dirNum]);
24 +               dirMatch->dirNameLen = strlen(dirNames[dirNum]);
25 +               dirMatch->files = NULL;
26 +               dirMatch->numFiles = 0;
27                 al->numDirs++;
28             }
29 +           dirMapping[dirNum] = dirMatch - al->dirs;
30 +       
31         }
32  
33         free(dirNames);
34 @@ -374,9 +377,6 @@
35  
36             first = last + 1;
37         }
38 -
39 -       if (origNumDirs + al->numDirs)
40 -           qsort(al->dirs, al->numDirs, sizeof(dirNeedle), dirInfoCompare);
41  
42      }
43  
44 --- ./lib/misc.c.org    Mon Jun 25 17:59:49 2001
45 +++ ./lib/misc.c        Mon Jun 25 18:04:36 2001
46 @@ -869,3 +869,39 @@
47                 &pEVR, 1);
48      }
49  }
50 +
51 +/* Based on glibc's function bsearch.
52 + * Modified by Pawel Kolodziej <pawelk@pld.org.pl>
53 + * Perform a binary search for KEY in BASE which has NMEMB elements
54 + * of SIZE bytes each.  The comparisons are done by (*COMPAR)(). 
55 + * Return element not less then KEY. Return NULL if all elements are 
56 + * less then KEY
57 + */
58 +void *
59 +bsearchnl (const void *key, const void *base, size_t nmemb, size_t size,
60 +        int (*compar) (const void *, const void *))
61 +{
62 +  size_t l, u, idx;
63 +  const void *p;
64 +  int comparison;
65 +
66 +  l = 0;
67 +  u = nmemb;
68 +  while (l < u)
69 +    {
70 +      idx = (l + u) / 2;
71 +      p = (void *) (((const char *) base) + (idx * size));
72 +      comparison = (*compar) (key, p);
73 +      if (comparison < 0)
74 +       u = idx;
75 +      else if (comparison > 0)
76 +       l = idx + 1;
77 +      else
78 +       return (void *) p;
79 +    }
80 +  if((long)l > (long)nmemb-1)
81 +         return NULL;
82 +  p = (void *) (((const char *) base) + (l * size));
83 +  return (void *)p;
84 +}
85 +
86 --- ./lib/misc.h.org    Mon Jun 25 17:59:49 2001
87 +++ ./lib/misc.h        Mon Jun 25 18:01:53 2001
88 @@ -102,6 +102,12 @@
89   */
90  void providePackageNVR(Header h);
91  
92 +
93 +void *
94 +bsearchnl (const void *key, const void *base, size_t nmemb, size_t size,
95 +        int (*compar) (const void *, const void *));
96 +
97 +
98  #ifdef __cplusplus
99  }
100  #endif
This page took 0.713352 seconds and 4 git commands to generate.