Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 1414853008: Validate pixel data array is enough for request by texImage3D and texSubImage3D (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: clean rebase Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 3823 matching lines...) Expand 10 before | Expand all | Expand 10 after
3834 WebGLFramebuffer* readFramebufferBinding = nullptr; 3834 WebGLFramebuffer* readFramebufferBinding = nullptr;
3835 GLenum readBufferInternalFormat = 0, readBufferType = 0; 3835 GLenum readBufferInternalFormat = 0, readBufferType = 0;
3836 if (!validateReadBufferAndGetInfo("readPixels", readFramebufferBinding, &rea dBufferInternalFormat, &readBufferType)) 3836 if (!validateReadBufferAndGetInfo("readPixels", readFramebufferBinding, &rea dBufferInternalFormat, &readBufferType))
3837 return false; 3837 return false;
3838 if (!validateReadPixelsFormatTypeCombination(format, type, readBufferInterna lFormat, readBufferType)) 3838 if (!validateReadPixelsFormatTypeCombination(format, type, readBufferInterna lFormat, readBufferType))
3839 return false; 3839 return false;
3840 3840
3841 // Calculate array size, taking into consideration of PACK_ALIGNMENT. 3841 // Calculate array size, taking into consideration of PACK_ALIGNMENT.
3842 unsigned totalBytesRequired = 0; 3842 unsigned totalBytesRequired = 0;
3843 unsigned padding = 0; 3843 unsigned padding = 0;
3844 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, m_packAlignment, &totalBytesRequired, &padding); 3844 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, 1, m_packAlignment, &totalBytesRequired, &padding);
3845 if (error != GL_NO_ERROR) { 3845 if (error != GL_NO_ERROR) {
3846 synthesizeGLError(error, "readPixels", "invalid dimensions"); 3846 synthesizeGLError(error, "readPixels", "invalid dimensions");
3847 return false; 3847 return false;
3848 } 3848 }
3849 if (bufferSize < static_cast<long long>(totalBytesRequired)) { 3849 if (bufferSize < static_cast<long long>(totalBytesRequired)) {
3850 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "buffer is not lar ge enough for dimensions"); 3850 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "buffer is not lar ge enough for dimensions");
3851 return false; 3851 return false;
3852 } 3852 }
3853 return true; 3853 return true;
3854 } 3854 }
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
4283 SkPaint paint; 4283 SkPaint paint;
4284 image->draw(buf->canvas(), paint, destRect, srcRect, DoNotRespectImageOrient ation, Image::DoNotClampImageToSourceRect); 4284 image->draw(buf->canvas(), paint, destRect, srcRect, DoNotRespectImageOrient ation, Image::DoNotClampImageToSourceRect);
4285 return buf->newImageSnapshot(); 4285 return buf->newImageSnapshot();
4286 } 4286 }
4287 4287
4288 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in ternalformat, 4288 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in ternalformat,
4289 GLsizei width, GLsizei height, GLint border, 4289 GLsizei width, GLsizei height, GLint border,
4290 GLenum format, GLenum type, DOMArrayBufferView* pixels) 4290 GLenum format, GLenum type, DOMArrayBufferView* pixels)
4291 { 4291 {
4292 if (isContextLost() || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour ceArrayBufferView, target, level, internalformat, width, height, border, format, type, 0, 0) 4292 if (isContextLost() || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour ceArrayBufferView, target, level, internalformat, width, height, border, format, type, 0, 0)
4293 || !validateTexFuncData("texImage2D", level, width, height, format, type , pixels, NullAllowed)) 4293 || !validateTexFuncData("texImage2D", level, width, height, 1, format, t ype, pixels, NullAllowed))
4294 return; 4294 return;
4295 void* data = pixels ? pixels->baseAddress() : 0; 4295 void* data = pixels ? pixels->baseAddress() : 0;
4296 Vector<uint8_t> tempData; 4296 Vector<uint8_t> tempData;
4297 bool changeUnpackAlignment = false; 4297 bool changeUnpackAlignment = false;
4298 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { 4298 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
4299 if (!WebGLImageConversion::extractTextureData(width, height, format, typ e, m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, tempData)) 4299 if (!WebGLImageConversion::extractTextureData(width, height, format, typ e, m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, tempData))
4300 return; 4300 return;
4301 data = tempData.data(); 4301 data = tempData.data();
4302 changeUnpackAlignment = true; 4302 changeUnpackAlignment = true;
4303 } 4303 }
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
4607 webContext()->texSubImage2D(target, level, xoffset, yoffset, imageExtractor. imageWidth(), imageExtractor.imageHeight(), format, type, needConversion ? data .data() : imagePixelData); 4607 webContext()->texSubImage2D(target, level, xoffset, yoffset, imageExtractor. imageWidth(), imageExtractor.imageHeight(), format, type, needConversion ? data .data() : imagePixelData);
4608 if (m_unpackAlignment != 1) 4608 if (m_unpackAlignment != 1)
4609 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); 4609 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
4610 } 4610 }
4611 4611
4612 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, 4612 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
4613 GLsizei width, GLsizei height, 4613 GLsizei width, GLsizei height,
4614 GLenum format, GLenum type, DOMArrayBufferView* pixels) 4614 GLenum format, GLenum type, DOMArrayBufferView* pixels)
4615 { 4615 {
4616 if (isContextLost() || !validateTexFunc("texSubImage2D", TexSubImage2D, Sour ceArrayBufferView, target, level, 0, width, height, 0, format, type, xoffset, yo ffset) 4616 if (isContextLost() || !validateTexFunc("texSubImage2D", TexSubImage2D, Sour ceArrayBufferView, target, level, 0, width, height, 0, format, type, xoffset, yo ffset)
4617 || !validateTexFuncData("texSubImage2D", level, width, height, format, t ype, pixels, NullNotAllowed)) 4617 || !validateTexFuncData("texSubImage2D", level, width, height, 1, format , type, pixels, NullNotAllowed))
4618 return; 4618 return;
4619 void* data = pixels->baseAddress(); 4619 void* data = pixels->baseAddress();
4620 Vector<uint8_t> tempData; 4620 Vector<uint8_t> tempData;
4621 bool changeUnpackAlignment = false; 4621 bool changeUnpackAlignment = false;
4622 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { 4622 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
4623 if (!WebGLImageConversion::extractTextureData(width, height, format, typ e, 4623 if (!WebGLImageConversion::extractTextureData(width, height, format, typ e,
4624 m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, te mpData)) 4624 m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, te mpData))
4625 return; 4625 return;
4626 data = tempData.data(); 4626 data = tempData.data();
4627 changeUnpackAlignment = true; 4627 changeUnpackAlignment = true;
(...skipping 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after
5707 return false; 5707 return false;
5708 5708
5709 if (border) { 5709 if (border) {
5710 synthesizeGLError(GL_INVALID_VALUE, functionName, "border != 0"); 5710 synthesizeGLError(GL_INVALID_VALUE, functionName, "border != 0");
5711 return false; 5711 return false;
5712 } 5712 }
5713 5713
5714 return true; 5714 return true;
5715 } 5715 }
5716 5716
5717 bool WebGLRenderingContextBase::validateTexFuncData(const char* functionName, GL int level, GLsizei width, GLsizei height, GLenum format, GLenum type, DOMArrayBu fferView* pixels, NullDisposition disposition) 5717 bool WebGLRenderingContextBase::validateTexFuncData(const char* functionName, GL int level, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum t ype, DOMArrayBufferView* pixels, NullDisposition disposition)
5718 { 5718 {
5719 // All calling functions check isContextLost, so a duplicate check is not ne eded here. 5719 // All calling functions check isContextLost, so a duplicate check is not ne eded here.
5720 if (!pixels) { 5720 if (!pixels) {
5721 if (disposition == NullAllowed) 5721 if (disposition == NullAllowed)
5722 return true; 5722 return true;
5723 synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels"); 5723 synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels");
5724 return false; 5724 return false;
5725 } 5725 }
5726 5726
5727 if (!validateSettableTexFormat(functionName, format)) 5727 if (!validateSettableTexFormat(functionName, format))
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
5784 if (pixels->type() != DOMArrayBufferView::TypeUint16) { 5784 if (pixels->type() != DOMArrayBufferView::TypeUint16) {
5785 synthesizeGLError(GL_INVALID_OPERATION, functionName, "type HALF_FLO AT_OES but ArrayBufferView is not NULL and not Uint16Array"); 5785 synthesizeGLError(GL_INVALID_OPERATION, functionName, "type HALF_FLO AT_OES but ArrayBufferView is not NULL and not Uint16Array");
5786 return false; 5786 return false;
5787 } 5787 }
5788 break; 5788 break;
5789 default: 5789 default:
5790 ASSERT_NOT_REACHED(); 5790 ASSERT_NOT_REACHED();
5791 } 5791 }
5792 5792
5793 unsigned totalBytesRequired; 5793 unsigned totalBytesRequired;
5794 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, m_unpackAlignment, &totalBytesRequired, 0); 5794 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, depth, m_unpackAlignment, &totalBytesRequired, 0);
5795 if (error != GL_NO_ERROR) { 5795 if (error != GL_NO_ERROR) {
5796 synthesizeGLError(error, functionName, "invalid texture dimensions"); 5796 synthesizeGLError(error, functionName, "invalid texture dimensions");
5797 return false; 5797 return false;
5798 } 5798 }
5799 if (pixels->byteLength() < totalBytesRequired) { 5799 if (pixels->byteLength() < totalBytesRequired) {
5800 if (m_unpackAlignment != 1) { 5800 if (m_unpackAlignment != 1) {
5801 error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, 1, &totalBytesRequired, 0); 5801 error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, depth, 1, &totalBytesRequired, 0);
5802 if (pixels->byteLength() == totalBytesRequired) { 5802 if (pixels->byteLength() == totalBytesRequired) {
5803 synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBuff erView not big enough for request with UNPACK_ALIGNMENT > 1"); 5803 synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBuff erView not big enough for request with UNPACK_ALIGNMENT > 1");
5804 return false; 5804 return false;
5805 } 5805 }
5806 } 5806 }
5807 synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBufferView n ot big enough for request"); 5807 synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBufferView n ot big enough for request");
5808 return false; 5808 return false;
5809 } 5809 }
5810 return true; 5810 return true;
5811 } 5811 }
(...skipping 1116 matching lines...) Expand 10 before | Expand all | Expand 10 after
6928 6928
6929 return totalBytesPerPixel; 6929 return totalBytesPerPixel;
6930 } 6930 }
6931 6931
6932 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const 6932 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const
6933 { 6933 {
6934 return m_drawingBuffer.get(); 6934 return m_drawingBuffer.get();
6935 } 6935 }
6936 6936
6937 } // namespace blink 6937 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698