Mercurial > libpst
annotate src/nick2ldif.cpp @ 359:a3e674fade6c
From Jeffrey Morlan:
pst_parse_block misreads Table Contexts (aka "type 2") with a
multi-block Row Matrix ("ind2"). Rows are never split between blocks -
every block except the last has padding at the end which should be
ignored. I've only seen this affect the recipients table, but
presumably it could affect attachments too. This was causing
out-of-bounds memory ranges to be returned from pst_getBlockOffset and
later access; patch fixes both the table reading issue and adds a
missing bounds check to pst_getBlockOffset (so as not to risk a
segfault if the PST is corrupted).
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Wed, 06 Jul 2016 10:20:12 -0700 |
parents | 8ad8fd1c5451 |
children |
rev | line source |
---|---|
16 | 1 /* |
2 | |
3 Copyright (c) 2004 Carl Byington - 510 Software Group, released under | |
4 the GPL version 2 or any later version at your choice available at | |
5 http://www.fsf.org/licenses/gpl.txt | |
6 | |
7 */ | |
8 | |
9 #include <iostream> | |
123
ab2a11e72250
more cleanup of #include files.
Carl Byington <carl@five-ten-sg.com>
parents:
118
diff
changeset
|
10 |
118
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
21
diff
changeset
|
11 extern "C" { |
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
21
diff
changeset
|
12 #include "define.h" |
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
21
diff
changeset
|
13 } |
16 | 14 |
15 char *ldap_base = NULL; | |
16 char *ldap_org = NULL; | |
17 char *ldap_class = NULL; | |
18 | |
19 using namespace std; | |
20 | |
258
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
21 int main(int argc, char* const* argv) { |
16 | 22 char c; |
23 char *temp; | |
24 while ((c = getopt(argc, argv, "b:c:"))!= -1) { | |
25 switch (c) { | |
26 case 'b': | |
27 ldap_base = optarg; | |
28 temp = strchr(ldap_base, ','); | |
29 if (temp) { | |
30 *temp = '\0'; | |
31 ldap_org = strdup(ldap_base); | |
32 *temp = ','; | |
33 } | |
34 break; | |
35 case 'c': | |
36 ldap_class = optarg; | |
37 break; | |
38 default: | |
39 break; | |
40 } | |
41 } | |
42 | |
43 const int LINE_SIZE = 2000; | |
44 char line[LINE_SIZE]; | |
45 while (!cin.eof()) { | |
46 cin.getline(line, LINE_SIZE); | |
47 int n = strlen(line); | |
48 if (!n) continue; | |
258
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
49 if (strncmp(line, "alias", 5) != 0) continue; // not alias |
16 | 50 char *f = line + 6; // skip alias keyword |
51 char *e; | |
52 if (*f == '"') { | |
53 f++; | |
54 e = strchr(f, '"'); | |
55 } | |
56 else { | |
57 e = strchr(f, ' '); | |
58 } | |
59 if (!e) continue; | |
60 *e = '\0'; | |
61 char *m = e+1; | |
62 while (*m == ' ') m++; | |
63 if (*m != '\0') { | |
258
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
64 char cn[1000], givenName[1000], sn[1000]; |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
65 snprintf(cn, sizeof(cn), "%s", f); |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
66 char *ff = strchr(f, ' '); |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
67 if (ff) { |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
68 strncpy(givenName, ff+1, sizeof(givenName)-1); |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
69 *ff = '\0'; |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
70 strncpy(sn, f, sizeof(sn)-1); |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
71 } |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
72 else { |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
73 strcpy(givenName, cn); |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
74 strcpy(sn, cn); |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
75 } |
16 | 76 printf("dn: cn=%s, %s\n", cn, ldap_base); |
77 printf("cn: %s\n", cn); | |
258
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
78 printf("givenName: %s\n", givenName); |
8ad8fd1c5451
check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents:
129
diff
changeset
|
79 printf("sn: %s\n", sn); |
16 | 80 printf("mail: %s\n", m); |
81 printf("objectClass: %s\n\n", ldap_class); | |
82 } | |
83 } | |
84 } |