From 441589fa43b4af606dc3e36ee24624e9bc17fb09 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Sat, 19 Nov 2022 19:44:16 +0900 Subject: [PATCH] include/queue: Base64-encoded data in queues 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. --- include/queue.sh | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/include/queue.sh b/include/queue.sh index dd592db..0aed18d 100644 --- a/include/queue.sh +++ b/include/queue.sh @@ -186,6 +186,7 @@ queue_put() { local mutex local sem local data + local encoded_item local err mutex=$(_queue_get_mutex "$queue") @@ -193,9 +194,13 @@ queue_put() { 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 @@ -217,6 +222,7 @@ queue_get() { local sem local mutex local data + local encoded_item local item local err @@ -236,7 +242,7 @@ queue_get() { 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 @@ -250,6 +256,10 @@ queue_get() { return 1 fi + if ! item=$(base64 -d <<< "$encoded_item"); then + return 1 + fi + echo "$item" return 0 } @@ -261,7 +271,7 @@ queue_foreach() { local data local mutex - local item + local encoded_item local err data=$(_queue_get_data "$name") @@ -273,7 +283,13 @@ queue_foreach() { 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 -- 2.47.3