Thanks for using the TrueNAS Community Edition issue tracker! TrueNAS Enterprise users receive direct support for their reports from our support portal.

ZFS dataset creation can fail with UTF decode error

Description

Traceback (most recent call last):
File "/usr/local/lib/python3.8/concurrent/futures/process.py", line 239, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs)
File "/usr/local/lib/python3.8/site-packages/middlewared/worker.py", line 91, in main_worker
res = MIDDLEWARE._run(*call_args)
File "/usr/local/lib/python3.8/site-packages/middlewared/worker.py", line 45, in _run
return self._call(name, serviceobj, methodobj, args, job=job)
File "/usr/local/lib/python3.8/site-packages/middlewared/worker.py", line 39, in _call
return methodobj(*params)
File "/usr/local/lib/python3.8/site-packages/middlewared/worker.py", line 39, in _call
return methodobj(*params)
File "/usr/local/lib/python3.8/site-packages/middlewared/schema.py", line 977, in nf
return f(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/middlewared/plugins/zfs.py", line 767, in do_create
pool.create(data['name'], params, fstype=getattr(libzfs.DatasetType, data['type']), sparse_vol=sparse)
File "libzfs.pyx", line 382, in libzfs.ZFS._exit_
File "/usr/local/lib/python3.8/site-packages/middlewared/plugins/zfs.py", line 767, in do_create
pool.create(data['name'], params, fstype=getattr(libzfs.DatasetType, data['type']), sparse_vol=sparse)
File "libzfs.pyx", line 2759, in libzfs.ZFSPool.create
File "libzfs.pyx", line 461, in libzfs.ZFS.get_error
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 19: invalid continuation byte
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 137, in call_method
result = await self.middleware._call(message['method'], serviceobj, methodobj, params, app=self,
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1191, in _call
return await methodobj(*prepared_call.args)
File "/usr/local/lib/python3.8/site-packages/middlewared/service.py", line 455, in create
rv = await self.middleware._call(
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1191, in _call
return await methodobj(*prepared_call.args)
File "/usr/local/lib/python3.8/site-packages/middlewared/schema.py", line 973, in nf
return await f(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/middlewared/plugins/pool.py", line 2909, in do_create
await self.middleware.call('zfs.dataset.create', {
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1233, in call
return await self._call(
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1191, in _call
return await methodobj(*prepared_call.args)
File "/usr/local/lib/python3.8/site-packages/middlewared/service.py", line 455, in create
rv = await self.middleware._call(
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1199, in _call
return await self._call_worker(name, *prepared_call.args)
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1205, in _call_worker
return await self.run_in_proc(main_worker, name, args, job)
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1132, in run_in_proc
return await self.run_in_executor(self.__procpool, method, *args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/middlewared/main.py", line 1106, in run_in_executor
return await loop.run_in_executor(pool, functools.partial(method, *args, **kwargs))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 19: invalid continuation byte

This should be caught and turned into a ValidationError or we should have a regex checking for valid dataset names.

Problem/Justification

None

Impact

None

SmartDraw Connector

Katalon Manual Tests (BETA)

Activity

Show:

Waqar Ahmed November 29, 2020 at 8:25 PM

Andrew Walker September 21, 2020 at 6:34 PM

root@bullstest:/home/awalker# /usr/sbin/zfs create data/датасет cannot create 'data/датасет': invalid character '�' in name root@bullstest:/home/awalker# /usr/sbin/zfs create data/yay! cannot create 'data/yay!': invalid character '!' in name

Okay. Problem is error string returned by libzfs.

Andrew Walker September 21, 2020 at 3:54 PM

utf decode error is unexpected here since zfs_create() should fail with EZFS_INVALIDNAME,

/* validate the path, taking care to note the extended error message */ if (!zfs_validate_name(hdl, path, type, B_TRUE)) return (zfs_error(hdl, EZFS_INVALIDNAME, errbuf));

Andrew Walker September 21, 2020 at 3:35 PM

zfs_create() does its checks via `zfs_validate_name()` which (among other things) wraps around `entity_namecheck()` in zfs_namecheck.c.

static int valid_char(char c) { return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == ':' || c == ' '); }
Complete
Pinned fields
Click on the next to a field label to start pinning.

Details

Assignee

Reporter

Impact

Low

Components

Fix versions

Affects versions

Priority

More fields

Katalon Platform

Created September 21, 2020 at 3:22 PM
Updated July 1, 2022 at 4:55 PM
Resolved November 30, 2020 at 1:04 PM