1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-12-02 01:17:52 +03:00

Improve sftp_parse_attr_4().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@591 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-04-23 09:37:28 +00:00
parent cedc9d71c3
commit fbc6543c83

View File

@@ -749,17 +749,17 @@ SFTP_DIR *sftp_opendir(SFTP_SESSION *sftp, const char *path){
return NULL; return NULL;
} }
/* parse the attributes from a payload from some messages */ /*
/* i coded it on baselines from the protocol version 4. */ * Parse the attributes from a payload from some messages. It is coded on
/* please excuse me for the inaccuracy of the code. it isn't my fault, it's sftp draft's one */ * baselines from the protocol version 4.
/* this code is dead anyway ... */ * This code is more or less dead but maybe we need it in future.
/* version 4 specific code */ */
static SFTP_ATTRIBUTES *sftp_parse_attr_4(SFTP_SESSION *sftp, BUFFER *buf, static SFTP_ATTRIBUTES *sftp_parse_attr_4(SFTP_SESSION *sftp, BUFFER *buf,
int expectnames) { int expectnames) {
u32 flags=0;
SFTP_ATTRIBUTES *attr; SFTP_ATTRIBUTES *attr;
STRING *owner = NULL; STRING *owner = NULL;
STRING *group = NULL; STRING *group = NULL;
u32 flags = 0;
int ok = 0; int ok = 0;
/* unused member variable */ /* unused member variable */
@@ -769,28 +769,39 @@ static SFTP_ATTRIBUTES *sftp_parse_attr_4(SFTP_SESSION *sftp, BUFFER *buf,
if (attr == NULL) { if (attr == NULL) {
return NULL; return NULL;
} }
ZERO_STRUCTP(attr);
memset(attr,0,sizeof(*attr)); /* This isn't really a loop, but it is like a try..catch.. */
/* it isn't really a loop, but i use it because it's like a try..catch.. construction in C */
do { do {
if(buffer_get_u32(buf,&flags)!=4) if (buffer_get_u32(buf, &flags) != 4) {
break; break;
}
flags = ntohl(flags); flags = ntohl(flags);
attr->flags = flags; attr->flags = flags;
if (flags & SSH_FILEXFER_ATTR_SIZE) { if (flags & SSH_FILEXFER_ATTR_SIZE) {
if(buffer_get_u64(buf,&attr->size)!=8) if (buffer_get_u64(buf, &attr->size) != 8) {
break; break;
}
attr->size = ntohll(attr->size); attr->size = ntohll(attr->size);
} }
if (flags & SSH_FILEXFER_ATTR_OWNERGROUP) { if (flags & SSH_FILEXFER_ATTR_OWNERGROUP) {
if(!(owner=buffer_get_ssh_string(buf))) if((owner = buffer_get_ssh_string(buf)) == NULL ||
break; (attr->owner = string_to_char(owner)) == NULL) {
if(!(group=buffer_get_ssh_string(buf)))
break; break;
} }
if(flags & SSH_FILEXFER_ATTR_PERMISSIONS){ if ((group = buffer_get_ssh_string(buf)) == NULL ||
if(buffer_get_u32(buf,&attr->permissions)!=4) (attr->group = string_to_char(group)) == NULL) {
break; break;
}
}
if (flags & SSH_FILEXFER_ATTR_PERMISSIONS) {
if (buffer_get_u32(buf, &attr->permissions) != 4) {
break;
}
attr->permissions = ntohl(attr->permissions); attr->permissions = ntohl(attr->permissions);
switch (attr->permissions & S_IFMT) { switch (attr->permissions & S_IFMT) {
@@ -814,78 +825,90 @@ static SFTP_ATTRIBUTES *sftp_parse_attr_4(SFTP_SESSION *sftp, BUFFER *buf,
break; break;
} }
} }
if (flags & SSH_FILEXFER_ATTR_ACCESSTIME) { if (flags & SSH_FILEXFER_ATTR_ACCESSTIME) {
if(buffer_get_u64(buf,&attr->atime64)!=8) if (buffer_get_u64(buf, &attr->atime64) != 8) {
break; break;
}
attr->atime64 = ntohll(attr->atime64); attr->atime64 = ntohll(attr->atime64);
} }
if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) { if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) {
if(buffer_get_u32(buf,&attr->atime_nseconds)!=4) if (buffer_get_u32(buf, &attr->atime_nseconds) != 4) {
break; break;
}
attr->atime_nseconds = ntohl(attr->atime_nseconds); attr->atime_nseconds = ntohl(attr->atime_nseconds);
} }
if (flags & SSH_FILEXFER_ATTR_CREATETIME) { if (flags & SSH_FILEXFER_ATTR_CREATETIME) {
if(buffer_get_u64(buf,&attr->createtime)!=8) if (buffer_get_u64(buf, &attr->createtime) != 8) {
break; break;
}
attr->createtime = ntohll(attr->createtime); attr->createtime = ntohll(attr->createtime);
} }
if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) { if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) {
if(buffer_get_u32(buf,&attr->createtime_nseconds)!=4) if (buffer_get_u32(buf, &attr->createtime_nseconds) != 4) {
break; break;
}
attr->createtime_nseconds = ntohl(attr->createtime_nseconds); attr->createtime_nseconds = ntohl(attr->createtime_nseconds);
} }
if (flags & SSH_FILEXFER_ATTR_MODIFYTIME) { if (flags & SSH_FILEXFER_ATTR_MODIFYTIME) {
if(buffer_get_u64(buf,&attr->mtime64)!=8) if (buffer_get_u64(buf, &attr->mtime64) != 8) {
break; break;
}
attr->mtime64 = ntohll(attr->mtime64); attr->mtime64 = ntohll(attr->mtime64);
} }
if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) { if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) {
if(buffer_get_u32(buf,&attr->mtime_nseconds)!=4) if (buffer_get_u32(buf, &attr->mtime_nseconds) != 4) {
break; break;
}
attr->mtime_nseconds = ntohl(attr->mtime_nseconds); attr->mtime_nseconds = ntohl(attr->mtime_nseconds);
} }
if (flags & SSH_FILEXFER_ATTR_ACL) { if (flags & SSH_FILEXFER_ATTR_ACL) {
if(!(attr->acl=buffer_get_ssh_string(buf))) if ((attr->acl = buffer_get_ssh_string(buf)) == NULL) {
break; break;
} }
}
if (flags & SSH_FILEXFER_ATTR_EXTENDED) { if (flags & SSH_FILEXFER_ATTR_EXTENDED) {
if(buffer_get_u32(buf,&attr->extended_count)!=4) if (buffer_get_u32(buf,&attr->extended_count) != 4) {
break; break;
}
attr->extended_count = ntohl(attr->extended_count); attr->extended_count = ntohl(attr->extended_count);
while(attr->extended_count && (attr->extended_type=buffer_get_ssh_string(buf))
&& (attr->extended_data=buffer_get_ssh_string(buf))){ while(attr->extended_count &&
(attr->extended_type = buffer_get_ssh_string(buf)) &&
(attr->extended_data = buffer_get_ssh_string(buf))){
attr->extended_count--; attr->extended_count--;
} }
if(attr->extended_count)
if (attr->extended_count) {
break; break;
} }
}
ok = 1; ok = 1;
} while (0); } while (0);
if(!ok){
if (ok == 0) {
/* break issued somewhere */ /* break issued somewhere */
if(owner) string_free(owner);
free(owner); string_free(group);
if(group) string_free(attr->acl);
free(group); string_free(attr->extended_type);
if(attr->acl) string_free(attr->extended_data);
free(attr->acl); SAFE_FREE(attr->owner);
if(attr->extended_type) SAFE_FREE(attr->group);
free(attr->extended_type); SAFE_FREE(attr);
if(attr->extended_data)
free(attr->extended_data);
free(attr);
ssh_set_error(sftp->session, SSH_FATAL, "Invalid ATTR structure"); ssh_set_error(sftp->session, SSH_FATAL, "Invalid ATTR structure");
return NULL; return NULL;
} }
/* everything went smoothly */
if(owner){
attr->owner=string_to_char(owner);
free(owner);
}
if(group){
attr->group=string_to_char(group);
free(group);
}
return attr; return attr;
} }