diff options
| author | nicm <> | 2016-09-04 16:56:02 +0000 | 
|---|---|---|
| committer | nicm <> | 2016-09-04 16:56:02 +0000 | 
| commit | d7124f76ae800a41e16411b0c22be2a341c922f5 (patch) | |
| tree | 1d157a43748660f622e2a5cb7be066097f3cea4b /src/lib/libc | |
| parent | 09db2f3586369ef8cf88ed6e6d1ab5189aceb610 (diff) | |
| download | openbsd-d7124f76ae800a41e16411b0c22be2a341c922f5.tar.gz openbsd-d7124f76ae800a41e16411b0c22be2a341c922f5.tar.bz2 openbsd-d7124f76ae800a41e16411b0c22be2a341c922f5.zip  | |
Set errno more consistently, and fix a warning, ok tedu
Diffstat (limited to '')
| -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 | ||
