Re: [PATCH] POSIX-hostname up to 255 characters

From: Eric W. Biederman
Date: Sat May 27 2006 - 09:55:48 EST


"Randy.Dunlap" <rdunlap@xxxxxxxxxxxx> writes:

>> > "Randy.Dunlap" <rdunlap@xxxxxxxxxxxx> writes:
>> >
>> > > This patch is against 2.6.17-rc5, for review/comments, please.
>> > > It won't apply to -mm since Andrew has merged the uts-namespace patches.
>> > > I'll see about merging it with those patches next.
>> > > ---
>
> Per Eric's comments:
>
> 1. use existing sys_gethostname() and sys_sethostname().
>
> 2. add sys_uname_long() to read struct long_utsname;
>
> 3. removed EXPORT_SYMBOL()s

I have to confess I am still uneasy with sys_uname_long.

The problem is that we have several revisions of this system
call almost always simply to accommodate long string lengths,
and the new interface doesn't seem any less susceptible to
handling longer strings than the old one.

Could we do something like:
long sys_unamev(int count, char __user **name, size_t name_len)
{
char *table[] = {
system_utsname.sysname,
system_utsname.nodename,
system_utsname.release,
system_utsname.version,
system_utsname.machine,
system_utsname.domainname,
};
char __user *data;
long error;
long len;
int i;

down_read(&uts_sem);

error = -EINVAL;
if (count > 6)
goto out;

len = sizeof(char __user *) * count;
for (i = 0; i < count; i++) {
len += strlen(table[i]) + 1;
}

error = -ERANGE;
if (len > name_len)
goto out;

error = -EFAULT;
if (!name)
goto out;
if (!access_ok(VERIFY_WRITE, name, name_len))
goto out;

error = 0;
data = (char __user *)&name[count];
for (i = 0; i < count; i++) {
size_t len = strlen(table[i]) + 1;
error |= __put_user(data, name[i]);
error |= __copy_to_user(data, table[i], len);
data += len;
}
out:
up_read(&uts_sem);
return error;
}

And then in user space we can do.
struct utsname {
char *sysname;
char *nodename;
char *release;
char *version;
char *machine;
char *domainname;
char buf[4096 - (sizeof(char *)*6)];
};

int uname(struct utsname *buf)
{
return sys_unamev(6, buf, sizeof(*buf));
}

Eric
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/