Queues are line-oriented, but the queue functions do not make sure
that user data does not contain newlines, causing data corruption
if the user inserts data that contains newlines.
This commit modifies the queue to store data in base64 format,
avoiding data-dependent behavior.
local mutex
local sem
local data
+ local encoded_item
local err
mutex=$(_queue_get_mutex "$queue")
data=$(_queue_get_data "$queue")
err=0
+ if ! encoded_item=$(base64 -w 0 <<< "$item"); then
+ return 1
+ fi
+
mutex_lock "$mutex"
- if ! echo "$item" >> "$data"; then
+ if ! echo "$encoded_item" >> "$data"; then
err=1
fi
local sem
local mutex
local data
+ local encoded_item
local item
local err
mutex_lock "$mutex"
- if ! item=$(head -n 1 "$data" 2>/dev/null); then
+ if ! encoded_item=$(head -n 1 "$data" 2>/dev/null); then
err=true
else
if ! sed -i '1d' "$data" &>/dev/null; then
return 1
fi
+ if ! item=$(base64 -d <<< "$encoded_item"); then
+ return 1
+ fi
+
echo "$item"
return 0
}
local data
local mutex
- local item
+ local encoded_item
local err
data=$(_queue_get_data "$name")
fi
if [ -f "$data" ]; then
- while read -r item; do
+ while read -r encoded_item; do
+ local item
+
+ if ! item=$(base64 -d <<< "$encoded_item"); then
+ continue
+ fi
+
if ! "$func" "$item" "${args[@]}"; then
err=1
break