ZFS dataset creation can fail with UTF decode error
Description
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
Details
Assignee
Waqar Ahmed
Waqar AhmedReporter
Andrew Walker
Andrew WalkerLabels
Impact
Low
Components
Fix versions
Affects versions
Priority
More fields
Time tracking
More fields
Time trackingKatalon Platform
Linked Test Cases, Katalon Defect Results, Katalon Studio Test Results
Katalon Platform
Linked Test Cases, Katalon Defect Results, Katalon Studio Test Results
Created September 21, 2020 at 3:22 PM
Updated July 1, 2022 at 4:55 PM
Resolved November 30, 2020 at 1:04 PM
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.