int git_pqueue_insert(git_pqueue *q, void *d) { void *tmp; size_t i; size_t newsize; if (!q) return 1; /* allocate more memory if necessary */ if (q->size >= q->avail) { newsize = q->size + q->step; if ((tmp = git__realloc(q->d, sizeof(void *) * newsize)) == NULL) return GIT_ENOMEM; q->d = tmp; q->avail = newsize; } /* insert item */ i = q->size++; q->d[i] = d; bubble_up(q, i); return GIT_SUCCESS; }
git_reference *git_reference__set_name( git_reference *ref, const char *name) { size_t namelen = strlen(name); git_reference *rewrite = git__realloc(ref, sizeof(git_reference) + namelen + 1); if (rewrite != NULL) memcpy(rewrite->name, name, namelen + 1); return rewrite; }
git_reference *git_reference__set_name( git_reference *ref, const char *name) { size_t namelen = strlen(name); size_t reflen; git_reference *rewrite = NULL; if (!GIT_ADD_SIZET_OVERFLOW(&reflen, sizeof(git_reference), namelen) && !GIT_ADD_SIZET_OVERFLOW(&reflen, reflen, 1) && (rewrite = git__realloc(ref, reflen)) != NULL) memcpy(rewrite->name, name, namelen + 1); return rewrite; }
GIT_INLINE(int) resize_vector(git_vector *v, size_t new_size) { size_t new_bytes = new_size * sizeof(void *); void *new_contents; /* Check for overflow */ if (new_bytes / sizeof(void *) != new_size) GITERR_CHECK_ALLOC(NULL); new_contents = git__realloc(v->contents, new_bytes); GITERR_CHECK_ALLOC(new_contents); v->_alloc_size = new_size; v->contents = new_contents; return 0; }
static int write_index(git_oid *oid, git_index *index, const char *base, int baselen, int entry_no, int maxentries) { size_t size, offset; char *buffer; int nr, error; /* Guess at some random initial size */ size = maxentries * 40; buffer = git__malloc(size); if (buffer == NULL) return GIT_ENOMEM; offset = 0; for (nr = entry_no; nr < maxentries; ++nr) { git_index_entry *entry = git_index_get(index, nr); const char *pathname = entry->path, *filename, *dirname; int pathlen = strlen(pathname), entrylen; unsigned int write_mode; git_oid subtree_oid; git_oid *write_oid; /* Did we hit the end of the directory? Return how many we wrote */ if (baselen >= pathlen || memcmp(base, pathname, baselen) != 0) break; /* Do we have _further_ subdirectories? */ filename = pathname + baselen; dirname = strchr(filename, '/'); write_oid = &entry->oid; write_mode = entry->mode; if (dirname) { int subdir_written; #if 0 if (entry->mode != S_IFDIR) { free(buffer); return GIT_EOBJCORRUPTED; } #endif subdir_written = write_index(&subtree_oid, index, pathname, dirname - pathname + 1, nr, maxentries); if (subdir_written < GIT_SUCCESS) { free(buffer); return subdir_written; } nr = subdir_written - 1; /* Now we need to write out the directory entry into this tree.. */ pathlen = dirname - pathname; write_oid = &subtree_oid; write_mode = S_IFDIR; } entrylen = pathlen - baselen; if (offset + entrylen + 32 > size) { size = alloc_nr(offset + entrylen + 32); buffer = git__realloc(buffer, size); if (buffer == NULL) return GIT_ENOMEM; } offset += write_index_entry(buffer + offset, write_mode, filename, entrylen, write_oid); } error = git_odb_write(oid, index->repository->db, buffer, offset, GIT_OBJ_TREE); free(buffer); return (error == GIT_SUCCESS) ? nr : error; }