diff options
author | nicm <> | 2016-09-04 16:56:02 +0000 |
---|---|---|
committer | nicm <> | 2016-09-04 16:56:02 +0000 |
commit | c97db0cdd2e66e4e777a54ed7a6836d81a30d8e2 (patch) | |
tree | 1d157a43748660f622e2a5cb7be066097f3cea4b /src | |
parent | b713c4422dc21e06cdd9c33f6bdb0583dbb23903 (diff) | |
download | openbsd-c97db0cdd2e66e4e777a54ed7a6836d81a30d8e2.tar.gz openbsd-c97db0cdd2e66e4e777a54ed7a6836d81a30d8e2.tar.bz2 openbsd-c97db0cdd2e66e4e777a54ed7a6836d81a30d8e2.zip |
Set errno more consistently, and fix a warning, ok tedu
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libc/stdlib/icdb.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/src/lib/libc/stdlib/icdb.c b/src/lib/libc/stdlib/icdb.c index e135bf025e..2ddd9db48c 100644 --- a/src/lib/libc/stdlib/icdb.c +++ b/src/lib/libc/stdlib/icdb.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: icdb.c,v 1.7 2016/09/04 14:51:39 nicm Exp $ */ | 1 | /* $OpenBSD: icdb.c,v 1.8 2016/09/04 16:56:02 nicm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org> | 3 | * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org> |
4 | * | 4 | * |
@@ -14,14 +14,16 @@ | |||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
16 | */ | 16 | */ |
17 | |||
18 | #include <errno.h> | ||
17 | #include <fcntl.h> | 19 | #include <fcntl.h> |
20 | #include <icdb.h> | ||
21 | #include <stddef.h> | ||
18 | #include <stdint.h> | 22 | #include <stdint.h> |
19 | #include <stdio.h> | 23 | #include <stdio.h> |
20 | #include <stddef.h> | ||
21 | #include <stdlib.h> | 24 | #include <stdlib.h> |
22 | #include <string.h> | 25 | #include <string.h> |
23 | #include <unistd.h> | 26 | #include <unistd.h> |
24 | #include <icdb.h> | ||
25 | 27 | ||
26 | #include <sys/mman.h> | 28 | #include <sys/mman.h> |
27 | #include <sys/stat.h> | 29 | #include <sys/stat.h> |
@@ -120,10 +122,10 @@ icdb_new(uint32_t version, uint32_t nentries, uint32_t entrysize, | |||
120 | struct icdbinfo *info; | 122 | struct icdbinfo *info; |
121 | int i; | 123 | int i; |
122 | 124 | ||
123 | if (entrysize == 0 || entrysize > 1048576) | 125 | if (entrysize == 0 || entrysize > 1048576 || nkeys > 8) { |
124 | return NULL; | 126 | errno = EINVAL; |
125 | if (nkeys > 8) | ||
126 | return NULL; | 127 | return NULL; |
128 | } | ||
127 | 129 | ||
128 | if (!(db = calloc(1, sizeof(*db)))) | 130 | if (!(db = calloc(1, sizeof(*db)))) |
129 | return NULL; | 131 | return NULL; |
@@ -156,7 +158,7 @@ icdb_open(const char *name, int flags, uint32_t version) | |||
156 | struct stat sb; | 158 | struct stat sb; |
157 | uint8_t *ptr = MAP_FAILED; | 159 | uint8_t *ptr = MAP_FAILED; |
158 | uint32_t baseoff, indexsize, idxmask, idxlen; | 160 | uint32_t baseoff, indexsize, idxmask, idxlen; |
159 | int fd, i; | 161 | int fd, i, saved_errno; |
160 | 162 | ||
161 | if ((fd = open(name, flags | O_CLOEXEC)) == -1) | 163 | if ((fd = open(name, flags | O_CLOEXEC)) == -1) |
162 | return NULL; | 164 | return NULL; |
@@ -169,10 +171,10 @@ icdb_open(const char *name, int flags, uint32_t version) | |||
169 | if (ptr == MAP_FAILED) | 171 | if (ptr == MAP_FAILED) |
170 | goto fail; | 172 | goto fail; |
171 | info = (struct icdbinfo *)ptr; | 173 | info = (struct icdbinfo *)ptr; |
172 | if (info->magic != magic) | 174 | if (info->magic != magic || info->version != version) { |
173 | goto fail; | 175 | errno = ENOENT; |
174 | if (info->version != version) | ||
175 | goto fail; | 176 | goto fail; |
177 | } | ||
176 | 178 | ||
177 | if (!(db = calloc(1, sizeof(*db)))) | 179 | if (!(db = calloc(1, sizeof(*db)))) |
178 | goto fail; | 180 | goto fail; |
@@ -191,11 +193,13 @@ icdb_open(const char *name, int flags, uint32_t version) | |||
191 | return db; | 193 | return db; |
192 | 194 | ||
193 | fail: | 195 | fail: |
196 | saved_errno = errno; | ||
194 | if (ptr != MAP_FAILED) | 197 | if (ptr != MAP_FAILED) |
195 | munmap(ptr, sb.st_size); | 198 | munmap(ptr, sb.st_size); |
196 | if (fd != -1) | 199 | if (fd != -1) |
197 | close(fd); | 200 | close(fd); |
198 | free(db); | 201 | free(db); |
202 | errno = saved_errno; | ||
199 | return NULL; | 203 | return NULL; |
200 | } | 204 | } |
201 | DEF_WEAK(icdb_open); | 205 | DEF_WEAK(icdb_open); |
@@ -211,14 +215,15 @@ icdb_get(struct icdb *db, void *entry, uint32_t idx) | |||
211 | DEF_WEAK(icdb_get); | 215 | DEF_WEAK(icdb_get); |
212 | 216 | ||
213 | int | 217 | int |
214 | icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, uint32_t *idxp) | 218 | icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, |
219 | uint32_t *idxp) | ||
215 | { | 220 | { |
216 | struct icdbinfo *info = db->info; | 221 | struct icdbinfo *info = db->info; |
217 | uint32_t offset; | 222 | uint32_t offset; |
218 | uint64_t hash; | 223 | uint64_t hash; |
219 | uint32_t indexsize, idxmask, idxlen; | 224 | uint32_t indexsize, idxmask, idxlen; |
220 | uint32_t *idxdata; | 225 | uint32_t *idxdata; |
221 | 226 | ||
222 | indexsize = info->indexsize; | 227 | indexsize = info->indexsize; |
223 | idxmask = indexsize - 1; | 228 | idxmask = indexsize - 1; |
224 | idxlen = indexsize * sizeof(uint32_t); | 229 | idxlen = indexsize * sizeof(uint32_t); |
@@ -227,8 +232,10 @@ icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, uint32_t | |||
227 | 232 | ||
228 | hash = SipHash24(&info->siphashkey, key, info->keysize[keynum]); | 233 | hash = SipHash24(&info->siphashkey, key, info->keysize[keynum]); |
229 | while ((offset = idxdata[hash & idxmask]) != -1) { | 234 | while ((offset = idxdata[hash & idxmask]) != -1) { |
230 | if (icdb_get(db, entry, offset) != 0) | 235 | if (icdb_get(db, entry, offset) != 0) { |
236 | errno = ENOENT; | ||
231 | return -1; | 237 | return -1; |
238 | } | ||
232 | if (memcmp((uint8_t *)entry + info->keyoffset[keynum], key, | 239 | if (memcmp((uint8_t *)entry + info->keyoffset[keynum], key, |
233 | info->keysize[keynum]) == 0) { | 240 | info->keysize[keynum]) == 0) { |
234 | if (idxp) | 241 | if (idxp) |
@@ -262,16 +269,17 @@ icdb_update(struct icdb *db, const void *entry, int offset) | |||
262 | uint32_t entrysize = info->entrysize; | 269 | uint32_t entrysize = info->entrysize; |
263 | uint32_t baseoff; | 270 | uint32_t baseoff; |
264 | uint32_t indexsize, idxmask, idxlen; | 271 | uint32_t indexsize, idxmask, idxlen; |
265 | 272 | ||
266 | indexsize = info->indexsize; | 273 | indexsize = info->indexsize; |
267 | idxmask = indexsize - 1; | 274 | idxmask = indexsize - 1; |
268 | idxlen = indexsize * sizeof(uint32_t); | 275 | idxlen = indexsize * sizeof(uint32_t); |
269 | baseoff = sizeof(*info) + idxlen * info->nkeys; | 276 | baseoff = sizeof(*info) + idxlen * info->nkeys; |
270 | 277 | ||
271 | memcpy((uint8_t *)db->entries + offset * entrysize, | 278 | memcpy((uint8_t *)db->entries + offset * entrysize, entry, entrysize); |
272 | entry, entrysize); | 279 | if (db->fd != -1) { |
273 | if (db->fd != -1) | 280 | msync((uint8_t *)db->entries + offset * entrysize, entrysize, |
274 | msync(db->entries + offset * entrysize, entrysize, MS_SYNC); | 281 | MS_SYNC); |
282 | } | ||
275 | return 0; | 283 | return 0; |
276 | } | 284 | } |
277 | DEF_WEAK(icdb_update); | 285 | DEF_WEAK(icdb_update); |
@@ -304,7 +312,7 @@ icdb_rehash(struct icdb *db) | |||
304 | uint32_t entrysize = info->entrysize; | 312 | uint32_t entrysize = info->entrysize; |
305 | uint32_t indexsize, idxmask, idxlen; | 313 | uint32_t indexsize, idxmask, idxlen; |
306 | int i, j; | 314 | int i, j; |
307 | 315 | ||
308 | indexsize = info->indexsize = roundup(info->nentries); | 316 | indexsize = info->indexsize = roundup(info->nentries); |
309 | idxmask = indexsize - 1; | 317 | idxmask = indexsize - 1; |
310 | idxlen = sizeof(uint32_t) * indexsize; | 318 | idxlen = sizeof(uint32_t) * indexsize; |
@@ -341,10 +349,10 @@ icdb_save(struct icdb *db, int fd) | |||
341 | uint32_t entrysize = info->entrysize; | 349 | uint32_t entrysize = info->entrysize; |
342 | uint32_t indexsize, idxlen; | 350 | uint32_t indexsize, idxlen; |
343 | int i; | 351 | int i; |
344 | 352 | ||
345 | if (icdb_rehash(db) != 0) | 353 | if (icdb_rehash(db) != 0) |
346 | return -1; | 354 | return -1; |
347 | 355 | ||
348 | indexsize = info->indexsize; | 356 | indexsize = info->indexsize; |
349 | idxlen = sizeof(uint32_t) * indexsize; | 357 | idxlen = sizeof(uint32_t) * indexsize; |
350 | 358 | ||