ترجمة آلية لم تُراجَع بعد. النص الإنجليزي هو المرجع في حال الاختلاف.
الملخص
يوجد تخصيص للذاكرة بقيمة حجم مفرطة في Apache Wicket. يقوم org.apache.wicket.markup.html.form.upload.resource.FileUploadToResourceField بتحميل الملفات إلى مورد مثبّت بشكل منفصل بدلاً من التحميل عبر نموذج، ويتم إخباره بالنتيجة لاحقاً عبر استدعاء Ajax الخاص به. يقرأ هذا الاستدعاء معلمة الطلب filesInfo، وهي مصفوفة JSON تحمل اسم ملف العميل وحجماً ونوع محتوى لكل ملف، ويحولها إلى قائمة FileUploadToResourceField.UploadInfo التي يتلقاها onUploadSuccess(). لا يربط أي شيء JSON بعملية تحميل قام بها المورد ولا يعيد اشتقاقها من الملفات المخزنة، لذا فإن عدد الإدخالات وكل قيمة فيها تكون أياً ما وفرته الطلبية. يتم عرض عنوان URL الخاص بالاستدعاء في الصفحة، ولا يلزم إجراء تحميل مسبق، وكل من طلبي GET و POST يصل إليه، لذا يمكن لأي عميل يمكنه تحميل الصفحة جعل المكون يُبلغ عن ملفات لم تُحمل أبداً، دون مصادقة تتجاوز ما تتطلبه الصفحة نفسها ودون أي تفاعل من المستخدم. يقوم UploadInfo#get()، الذي تقدمه الفئة كطريقة للحصول على بايتات التحميل، بتخصيص مصفوفة بايت من UploadInfo#getSize() قبل فتح الملف. وبالتالي يتم تحديد حجم المصفوفة بواسطة الرقم الذي وفره الطلب، ويحدث التخصيص حتى للملف الذي لم يتم تخزينه أبداً. طلب صغير واحد يمكن أن يكلف الخادم ما يقارب غيغابايتين من الذاكرة العشوائية (heap)، والطلب قابل للتكرار بسهولة، لذا فإن القليل منها يستنفد الذاكرة العشوائية لكل طلب تخدمه آلة Java الافتراضية. الحجم الذي يتحول التحويل إلى رقم صحيح int إلى رقم سالب يلقي بدوره استثناء NegativeArraySizeException، والذي لا يغغطيه معالج الاستثناءات داخل تلك الطريقة، لذا فهو يهرب إلى التطبيق. يتأثر التطبيق عندما يستخدم FileUploadToResourceField، وهو ليس مسار التحميل العادي عبر FileUploadField و Form ويجب تمديده وتثبيته عن قصد. يتطلب التخصيص بالإضافة إلى ذلك أن يقوم التطبيق باستدعاء UploadInfo#get() بدلاً من قراءة UploadInfo#getFile(...