mirror of
https://github.com/samba-team/samba.git
synced 2025-02-04 17:47:26 +03:00
Ensure tdb error code is set for corrupt and i/o errors before calling
the log function. This allows the log function to take action. Jeremy. (This used to be commit fcaacb5fabdf78dd6b6a7fe5ff5300d9e2ff8d75)
This commit is contained in:
parent
9a55edce96
commit
7308d1574e
@ -205,6 +205,11 @@ static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset,
|
|||||||
|
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
if (!probe && lck_type != F_SETLK) {
|
if (!probe && lck_type != F_SETLK) {
|
||||||
|
/* Ensure error code is set for log fun to examine. */
|
||||||
|
if (errno == EINTR && palarm_fired && *palarm_fired)
|
||||||
|
tdb->ecode = TDB_ERR_LOCK_TIMEOUT;
|
||||||
|
else
|
||||||
|
tdb->ecode = TDB_ERR_LOCK;
|
||||||
TDB_LOG((tdb, 5,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d lck_type=%d\n",
|
TDB_LOG((tdb, 5,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d lck_type=%d\n",
|
||||||
tdb->fd, offset, rw_type, lck_type));
|
tdb->fd, offset, rw_type, lck_type));
|
||||||
}
|
}
|
||||||
@ -312,6 +317,8 @@ static int tdb_oob(TDB_CONTEXT *tdb, tdb_off len, int probe)
|
|||||||
return 0;
|
return 0;
|
||||||
if (tdb->flags & TDB_INTERNAL) {
|
if (tdb->flags & TDB_INTERNAL) {
|
||||||
if (!probe) {
|
if (!probe) {
|
||||||
|
/* Ensure ecode is set for log fn. */
|
||||||
|
tdb->ecode = TDB_ERR_IO;
|
||||||
TDB_LOG((tdb, 0,"tdb_oob len %d beyond internal malloc size %d\n",
|
TDB_LOG((tdb, 0,"tdb_oob len %d beyond internal malloc size %d\n",
|
||||||
(int)len, (int)tdb->map_size));
|
(int)len, (int)tdb->map_size));
|
||||||
}
|
}
|
||||||
@ -323,6 +330,8 @@ static int tdb_oob(TDB_CONTEXT *tdb, tdb_off len, int probe)
|
|||||||
|
|
||||||
if (st.st_size < (size_t)len) {
|
if (st.st_size < (size_t)len) {
|
||||||
if (!probe) {
|
if (!probe) {
|
||||||
|
/* Ensure ecode is set for log fn. */
|
||||||
|
tdb->ecode = TDB_ERR_IO;
|
||||||
TDB_LOG((tdb, 0,"tdb_oob len %d beyond eof at %d\n",
|
TDB_LOG((tdb, 0,"tdb_oob len %d beyond eof at %d\n",
|
||||||
(int)len, (int)st.st_size));
|
(int)len, (int)st.st_size));
|
||||||
}
|
}
|
||||||
@ -351,6 +360,8 @@ static int tdb_write(TDB_CONTEXT *tdb, tdb_off off, void *buf, tdb_len len)
|
|||||||
else if (lseek(tdb->fd, off, SEEK_SET) != off
|
else if (lseek(tdb->fd, off, SEEK_SET) != off
|
||||||
|| write(tdb->fd, buf, len) != (ssize_t)len) {
|
|| write(tdb->fd, buf, len) != (ssize_t)len) {
|
||||||
#endif
|
#endif
|
||||||
|
/* Ensure ecode is set for log fn. */
|
||||||
|
tdb->ecode = TDB_ERR_IO;
|
||||||
TDB_LOG((tdb, 0,"tdb_write failed at %d len=%d (%s)\n",
|
TDB_LOG((tdb, 0,"tdb_write failed at %d len=%d (%s)\n",
|
||||||
off, len, strerror(errno)));
|
off, len, strerror(errno)));
|
||||||
return TDB_ERRCODE(TDB_ERR_IO, -1);
|
return TDB_ERRCODE(TDB_ERR_IO, -1);
|
||||||
@ -372,6 +383,8 @@ static int tdb_read(TDB_CONTEXT *tdb,tdb_off off,void *buf,tdb_len len,int cv)
|
|||||||
else if (lseek(tdb->fd, off, SEEK_SET) != off
|
else if (lseek(tdb->fd, off, SEEK_SET) != off
|
||||||
|| read(tdb->fd, buf, len) != (ssize_t)len) {
|
|| read(tdb->fd, buf, len) != (ssize_t)len) {
|
||||||
#endif
|
#endif
|
||||||
|
/* Ensure ecode is set for log fn. */
|
||||||
|
tdb->ecode = TDB_ERR_IO;
|
||||||
TDB_LOG((tdb, 0,"tdb_read failed at %d len=%d (%s)\n",
|
TDB_LOG((tdb, 0,"tdb_read failed at %d len=%d (%s)\n",
|
||||||
off, len, strerror(errno)));
|
off, len, strerror(errno)));
|
||||||
return TDB_ERRCODE(TDB_ERR_IO, -1);
|
return TDB_ERRCODE(TDB_ERR_IO, -1);
|
||||||
@ -387,6 +400,8 @@ static char *tdb_alloc_read(TDB_CONTEXT *tdb, tdb_off offset, tdb_len len)
|
|||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
if (!(buf = malloc(len))) {
|
if (!(buf = malloc(len))) {
|
||||||
|
/* Ensure ecode is set for log fn. */
|
||||||
|
tdb->ecode = TDB_ERR_OOM;
|
||||||
TDB_LOG((tdb, 0,"tdb_alloc_read malloc failed len=%d (%s)\n",
|
TDB_LOG((tdb, 0,"tdb_alloc_read malloc failed len=%d (%s)\n",
|
||||||
len, strerror(errno)));
|
len, strerror(errno)));
|
||||||
return TDB_ERRCODE(TDB_ERR_OOM, buf);
|
return TDB_ERRCODE(TDB_ERR_OOM, buf);
|
||||||
@ -415,6 +430,8 @@ static int rec_read(TDB_CONTEXT *tdb, tdb_off offset, struct list_struct *rec)
|
|||||||
if (tdb_read(tdb, offset, rec, sizeof(*rec),DOCONV()) == -1)
|
if (tdb_read(tdb, offset, rec, sizeof(*rec),DOCONV()) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
if (TDB_BAD_MAGIC(rec)) {
|
if (TDB_BAD_MAGIC(rec)) {
|
||||||
|
/* Ensure ecode is set for log fn. */
|
||||||
|
tdb->ecode = TDB_ERR_CORRUPT;
|
||||||
TDB_LOG((tdb, 0,"rec_read bad magic 0x%x at offset=%d\n", rec->magic, offset));
|
TDB_LOG((tdb, 0,"rec_read bad magic 0x%x at offset=%d\n", rec->magic, offset));
|
||||||
return TDB_ERRCODE(TDB_ERR_CORRUPT, -1);
|
return TDB_ERRCODE(TDB_ERR_CORRUPT, -1);
|
||||||
}
|
}
|
||||||
@ -443,6 +460,8 @@ static int rec_free_read(TDB_CONTEXT *tdb, tdb_off off, struct list_struct *rec)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rec->magic != TDB_FREE_MAGIC) {
|
if (rec->magic != TDB_FREE_MAGIC) {
|
||||||
|
/* Ensure ecode is set for log fn. */
|
||||||
|
tdb->ecode = TDB_ERR_CORRUPT;
|
||||||
TDB_LOG((tdb, 0,"rec_free_read bad magic 0x%x at offset=%d\n",
|
TDB_LOG((tdb, 0,"rec_free_read bad magic 0x%x at offset=%d\n",
|
||||||
rec->magic, off));
|
rec->magic, off));
|
||||||
return TDB_ERRCODE(TDB_ERR_CORRUPT, -1);
|
return TDB_ERRCODE(TDB_ERR_CORRUPT, -1);
|
||||||
@ -1809,7 +1828,11 @@ TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* close a database */
|
/**
|
||||||
|
* Close a database.
|
||||||
|
*
|
||||||
|
* @returns -1 for error; 0 for success.
|
||||||
|
**/
|
||||||
int tdb_close(TDB_CONTEXT *tdb)
|
int tdb_close(TDB_CONTEXT *tdb)
|
||||||
{
|
{
|
||||||
TDB_CONTEXT **i;
|
TDB_CONTEXT **i;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user